java - 如何将 @RolesAllowed 与 Keycloak 和 Java 一起使用?

标签 java web-services annotations keycloak

我是 Web 应用程序的新手,我尝试使用 keycloak 来了解所有这些授权/身份验证内容是如何工作的。 我还看了Quickstart Github Repo并尝试了this 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. 添加三个角色:adminuseremployee 以及各三个用户。
  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 的示例,但我不想更改我的设置...

最佳答案

我认为您的“问题”位于web.xml中。在这里,您将角色 adminemployee 设置为允许所有资源使用(因为 url 模式/*)。

关于java - 如何将 @RolesAllowed 与 Keycloak 和 Java 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61202650/

相关文章:

java - java中如何继承@JsonFormat注解?

java - Spring错误由: org. springframework.beans.factory.UnsatisfiedDependencyException引起:创建名称为 'test'的bean时出错

java - 在 Libgdx 中对贴花进行 HitTest

c# - ASMX 网络服务和 HTTP GET

symfony 路由注解需求约束

java - 使带注释的困惑远离领域模型

java - 如何在Nokia 1200 上安装J2ME?

java - 首都之间经过其他首都的最短路径

java - 使用 SOAP 使用 Web 服务

java - 是否有来自现有 wsdl 文件的 Java/Android 中使用的数据类的类生成器?