1
爲了使用JSR-250(RolesAllowed,PermitAll,DenyAll)的安全註解:的WebSphere自由JSR-250實現(RolesAllowed)
- 在新澤西,你會註冊RolesAllowedDynamicFeature類。
在RestEasy的,你可以使用的web.xml配置:
<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>
這兩個依靠SecurityContext.isUserInRole()
實現,但似乎在WebSphere Liberty配置文件沒有。
我們如何在WebSphere Liberty Profile(WLP)中使用它?
我用一個小例子:在一個過濾器
@Path("/rest")
public class HelloWorld {
@GET
@RolesAllowed("ANYTHING")
public Response hello() {
return Response.ok("Hello World").build();
}
}
與@RolesAllowed創建資源類/方法;
- 爲JAX-RS實現啓用「基於角色的安全性」。 (Jersey或RESTeasy等等,對於WLP,我必須添加appSecurity-2.0功能)
- 你應該有一個工作示例。
但是,即使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();
}
}
pom.xml中(只依賴)
<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>
server.xml中
代碼,是用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>
如果您爲liberty服務器提供了server.xml,這將會很有幫助。 – Alasdair
1.你知道授權是如何完成的嗎?你提到了RESTeasy和Jersey做了什麼組件,但沒有提到WS。 2.您是否已將您的身份驗證過濾器標記爲早期優先級:.e.g'@Priority(Priorities.AUTHENTICATED)'。 3.您是否在SecurityContext中設置了Principal(http://stackoverflow.com/a/34497750/2587435)? –
@peeskillet 1.也許我碰到了錯誤的文檔,但我發現唯一啓用「appSecurity-2.0」功能的文檔。 2.請參閱編輯代碼示例。 3.請參閱編輯代碼示例。 –