当前位置: 首页 > 知识库问答 >
问题:

WebSphere Liberty JSR-250实现(允许使用)

吕英才
2023-03-14

为了使用 JSR-250 的安全注释(RolesAllowed、PermitAll、DenyAll):

>

  • 在泽西岛,您将注册RolesAllowedDynamicFeature类
  • 在RESEasy中,您将使用web。xml配置:

    <context-param>
       <param-name>resteasy.role.based.security</param-name>
       <param-value>true</param-value>
    </context-param>
    

    这两者都依赖于<code>SecurityContext的实现。isUserInRole(),但WebSphere Liberty Profile似乎没有。

    我们如何在WebSphere Liberty Profile(WLP)中实现这一点?

    我用了一个最小的例子:

    >

  • 创建一个资源类/方法,使用@R照料允许:

    @Path("/rest")
    public class HelloWorld {
        @GET
        @RolesAllowed("ANYTHING")
        public Response hello() {
            return Response.ok("Hello World").build();
        }
    }
    

    然而,即使isUserInRole返回true,WebSphere Liberty Profile似乎也返回403 Forbidden。

    有没有人知道如何正确使用Liberty中的@RolesAllowed注释,以及我可能遗漏了什么?

    @ApplicationPath("/")
    public class MyApplication extends Application {
        public MyApplication() {}
    }
    
    @Provider
    @Priority(Priorities.AUTHENTICATION)
    public class AuthFilter implements ContainerRequestFilter {
        @Override
        public void filter(ContainerRequestContext ctx) throws IOException {
            System.out.println("Setting SecurityContext..");
            ctx.setSecurityContext(new MySecurityContext("someuser", "anyrole"));
        }
    }
    
    public class MySecurityContext implements SecurityContext {
    
        private String user;
        private String role;
    
        public static class MyPrincipal implements Principal {
            private String name;
    
            public MyPrincipal(String name) { this.name = name; }
            @Override public String getName() { return name; }
        }
    
        public MySecurityContext(String user, String role) {
            this.user = user;
            this.role = role;
        }
    
        @Override public String getAuthenticationScheme() { return "BASIC"; }
        @Override public Principal getUserPrincipal() { return new MyPrincipal(user); }
        @Override public boolean isSecure() { return true; }
    
        @Override
        public boolean isUserInRole(String role) {
            return true;
        }
    }
    
    @Path("/test")
    public class HelloWorld {
        @GET
        @RolesAllowed("doesntmatter")
        public Response hello() {
            return Response.ok("Hello World").build();
        }
    }
    
    <dependencies>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    

    代码在禁用appSecurity功能的情况下工作。启用时不工作。

    <server description="test">
        <featureManager>
            <feature>jaxrs-2.0</feature>
            <feature>localConnector-1.0</feature>
            <!--  <feature>appSecurity-2.0</feature> -->
        </featureManager>
    
        <webApplication id="RoleTest" location="RoleTest.war" name="RoleTest"/>
        <httpEndpoint httpPort="9081" httpsPort="9444" id="defaultHttpEndpoint"/>
    
        <!-- below lines are required when appSecurity feature is loaded -->
        <!--  
        <keyStore id="defaultKeyStore" password="{xor}Lz4sLCgwLTtu"/>
        <basicRegistry id="basic" realm="BasicRegistry"> 
            <user name="username" password="password" />
        </basicRegistry>
        -->
    </server>
    
  • 共有1个答案

    薛浩言
    2023-03-14

    也许你可以试试这个:

    1 台服务器.xml

    <server description="test">
        <featureManager>
            <feature>jaxrs-2.0</feature>
            <feature>appSecurity-2.0</feature>
        </featureManager>
    
        <webApplication id="RoleTest" location="RoleTest.war" name="RoleTest">
            <application-bnd>
                <security-role name="ANYTHING">
                    <user name="username" />
                </security-role>
                <security-role name="AuthenticationRole">
                    <user name="username" />
                </security-role>
                <security-role name="AllAuthenticated">
                    <special-subject type="ALL_AUTHENTICATED_USERS" />
                </security-role>
            </application-bnd>
        </webApplication>
    
        <httpEndpoint httpPort="9081" httpsPort="9444" id="defaultHttpEndpoint" />
    
        <basicRegistry id="basic" realm="BasicRegistry">
            <user name="username" password="password" />
        </basicRegistry>
    </server>
    

    2Java代码创建一个MyApplication类和一个资源类/方法与@R呼吸器允许:

    @ApplicationPath("/")
    public class MyApplication extends Application {
        public MyApplication() {}
        public Set<Class<?>> getClasses(){
          Set<Class<?>> classes = new HashSet();
          classes.add(HelloWorld.class);
    
          return classes;
       }
    }
    
    
    @Path("/rest")
    public class HelloWorld {
        @GET
        @RolesAllowed("ANYTHING")
        public Response hello() {
            return Response.ok("Hello World").build();
        }
    }
    

    3网页.xml

    <web-app 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 web-app_3_0.xsd"
        version="3.0">
    
      <display-name>Test Application</display-name>
      <description>blablabla</description>
    
        <servlet>
            <servlet-name>MyApplication</servlet-name>
            <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
            <init-param>
                <param-name>requestProcessorAttribute</param-name>
                <param-value>requestProcessorAttribute_webcontainer</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet>
            <servlet-name>com.xxx.MyApplication</servlet-name>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>SecurityContextApp</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>com.xxx.MyApplication</servlet-name>
            <url-pattern>/xxx/*</url-pattern>
        </servlet-mapping>
    
    
        <security-constraint id="SecurityConstraint_2">
            <web-resource-collection id="WebResourceCollection_2">
                <web-resource-name>com.xxx.MyApplication
                </web-resource-name>
                <description>Protection area for Rest Servlet</description>
                <url-pattern>/xxx/rest</url-pattern>
                <http-method>GET</http-method>
                <http-method>POST</http-method>
            </web-resource-collection>
            <user-data-constraint id="UserDataConstraint_2">
                <transport-guarantee>NONE</transport-guarantee>
            </user-data-constraint>
            <auth-constraint id="AuthConstraint_2">
                <role-name>AuthenticationRole</role-name>
            </auth-constraint>
        </security-constraint>    
    
    
        <login-config>
            <auth-method>BASIC</auth-method>
            <realm-name>test</realm-name>
        </login-config>
        <security-role id="SecurityRole_1">
            <description>blabla</description>
            <role-name>ANYTHING</role-name>
        </security-role>
    
        <security-role id="SecurityRole_2">
            <role-name>AuthenticationRole</role-name>
        </security-role>
    
    </web-app>
    

    任何其他问题,给我留言。

     类似资料:
    • 有些项目可能更倾向于使用非Spring的MVC框架。 许多团队希望仍然使用现有的技术栈,比如JSF等,这样他们掌握的技能和工具依然能发挥作用。 如果你确实不想使用Spring的Web MVC,但又希望能从Spring提供的一些解决方案中受益,那么将你所使用的框架和Spring进行集成也很容易。只需要在ContextLoaderListener中启动一个Spring的根应用上下文(root appl

    • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

    • 在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。

    • 问题内容: 但是那里给出的解决方案不起作用。他们说我需要采取以下行动: 在项目结构中| 在“项目”对话框中,在界面中将“项目语言级别”更改为6.0-@Override。 但是,目前项目语言级别是6.0,但是我仍然看到错误。 维克(Vic),这是一个窗口,并且在语言级(Language level)下没有JVM版本(不幸的是,由于我有10个信誉,所以我无法发布图像) 问题答案: 如果您的项目有多个模

    • 我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码:

    • Spring还支持基于JSR-250的注释,包括@ PostConstruct,@ PreDestroy和@Resource注释。 虽然这些注释并不是真的需要,因为你已经有了其他的替代品,但让我们对它们进行简要的了解。 @PostConstruct和@PreDestroy注释 要定义bean的设置和拆卸,我们只需使用init-method和/或destroy-method参数声明<bean>。 i