如何用Keycloak和Java使用@RolesAllowed?

问题描述 投票:0回答:1

我是Web应用的新手,我玩了一下keycloak,想知道这些授权认证的东西是如何工作的。快速启动Github Repo 并尝试了 这个 由mastertheboss快速入门。

在本教程中,只有一个简单的 REST 服务

package annotation_test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloService {
    @GET
    @Path("/text")
    public String getHello () 
    {
        return "hello world!";
    } 
    @GET
    @Path("/json")
    @Produces(MediaType.APPLICATION_JSON)
    public SimpleProperty getPropertyJSON ()
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }
    @GET
    @Path("/xml")
    @Produces(MediaType.APPLICATION_XML)
    public SimpleProperty getPropertyXML () 
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }
}

现在我做了如下修改。

  1. 增加三个角色: admin, user, employee 和三个用户分别。
  2. 编辑 web.xml 如下
<?xml version="1.0"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

 <security-constraint>
    <web-resource-collection>
        <web-resource-name>All Resources</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
        <role-name>employee</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>KEYCLOAK</auth-method>
    <realm-name>Test</realm-name>
</login-config>

<security-role>
    <role-name>admin</role-name>
</security-role>
<security-role>
    <role-name>employee</role-name>
</security-role>
</web-app>

现在 REST 端点只对角色中的用户开放"admin"和"employee".现在我想玩玩安全注解,就试了下。

package annotation_test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.annotation.security.RolesAllowed;


@Path("/hello")
public class HelloService {
    @GET
    @Path("/text")
    public String getHello () 
    {
        return "hello world!";
    }

    @RolesAllowed("employee")
    @GET
    @Path("/json")
    @Produces(MediaType.APPLICATION_JSON)
    public SimpleProperty getPropertyJSON ()
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }

    @RolesAllowed("admin")
    @GET
    @Path("/xml")
    @Produces(MediaType.APPLICATION_XML)
    public SimpleProperty getPropertyXML () 
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }
} 

但是,只要用户拥有角色"admin"或"employee"它可以接触到一切。

这个注释的事情怎么做才正确?我想使用我在keycloak中定义的角色,在我的代码中使用注释来限制访问,这样我就必须尽可能少的修改代码。我找到了一些SpringBoot的例子,但我不想改变我的设置... ...

java web-services annotations keycloak
1个回答
0
投票

我想你的 "问题 "是出在 web.xml. 在这里你可以设置角色 adminemployee 允许所有资源使用(因为url-pattern *)。

© www.soinside.com 2019 - 2024. All rights reserved.