[英]JAX-WS webservice and @rolesAllowed
是否可以在JAX-WS Web服務上使用@RolesAllowed
注釋,如果可以,如何使用?
我在使用基本身份驗證的glassfish 3.1.1上有一個web服務,但忽略了使用@RolesAllowed
表達的限制。 角色信息應該可用,因為我可以像這樣訪問它:
@Resource
WebServiceContext wsContext;
if (wsContext.isUserInRole("READ"))
log.info("Role: READ");
我得到了預期的角色,但仍然可以訪問所有方法,即使@RolesAllowed
設置為不同的角色。 @DenyAll
也不行。
如果不支持這些注釋,是否可以使用部署描述符來管理基於用戶角色的Web服務方法的訪問?
編輯 :JAVA EE 6教程的這一部分描述了@RolesAllowed
注釋的用法。 它讀
對於Java EE組件,可以使用@DeclareRoles和@RolesAllowed元數據注釋定義安全角色。
Web服務未在本教程的第一部分中列為Java EE組件,因此看起來不支持安全注釋。
編輯2繼Izan的帖子后,我再試一次。 這是我做的:
@Webservice
@DeclareRoles(value = {"READ", "UPDATE", "DELETE"})
public class ServiceImpl implements Service {
@Override
@WebMethod(operationName = "helloWorld")
@RolesAllowed({"NONE"})
public String helloWorld() throws Exception {
return "Hello World!";
}
}
使用這種設置,無論設置什么角色,每個人都可以訪問該方法。 用戶獲得身份驗證(可以在audit.log中看到),但不會進行授權。 如上所述,我可以從WebServiceContext
訪問該角色(我實際上使用此信息進行手動授權)。
添加@Stateless
注釋,讓我使用安全注釋。 所以@permitAll
按預期工作。 但是使用角色仍然不起作用,因為用戶現在無法進行身份驗證。 它們在審計日志中顯示為ANONYMOUS
,並且拒絕訪問它們。
我的web.xml
看起來像這樣:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>OneMore</display-name>
<security-constraint>
<display-name>WebServiceSecurity</display-name>
<web-resource-collection>
<web-resource-name>Authorized users only</web-resource-name>
<url-pattern>/service</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>READ</role-name>
<role-name>UPDATE</role-name>
<role-name>DELETE</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>READ</role-name>
</security-role>
<security-role>
<role-name>UPDATE</role-name>
</security-role>
<security-role>
<role-name>DELETE</role-name>
</security-role>
</web-app>
Glassfish-web.xml
只是將角色名稱映射到組名,如下所示:
<security-role-mapping>
<role-name>READ</role-name>
<group-name>READ</group-name>
</security-role-mapping>
編輯3感謝Izan和無數次嘗試后我終於開始工作了。
如前所述,重點是通過添加@Stateless
注釋從普通Web服務切換到EJB Web服務。 這允許使用安全注釋。
此更改也需要更改部署描述符。 雖然原始Web服務需要glassfish-web.xml
來設置角色,但之后需要glassfish-ejb-jar.xml
。
也許這是一個非常愚蠢的問題,但是你的webservices EJB是什么? 如GlassFish中的安全注釋和授權以及Java EE 5 SDK中所述
注釋@ PermitAll,@ DenyAll和@RolesAllowed用於指定EJB業務方法的權限
我使用那些帶有來自無狀態EJB的自下而上WS的注釋,它們就像JBoss中的魅力一樣。
編輯1 @TPete我會添加一些代碼來向您顯示我正在做的事情。
@Stateless
@WebService()
@WebContext(contextRoot = WSContextRoot.CTX_ROOT,
authMethod = "BASIC")
@EndpointConfig(configName = "Standard WSSecurity Endpoint")
@SecurityDomain(value = "myDeclaredDomain")
@RolesAllowed({ "AUTHORISED" })
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
public class MyWS implements MyInterface {
@Override
public void doSomething(){
//impl
}
}
至於界面
@Remote
@WebService
public interface MyInterface {
@WebMethod(operationName="doSomething")
public void doSomething();
}
WebContext,EndpointConfig和SecurityDomain是JBoss注釋,但我認為GlassFish有類似的東西,或類似的方法。 安全域包含在jboss的部署描述符中,並在login-config.xml中從JBoss的配置文件中定義。
編輯2 @TPete
我想你需要從Glassfish中添加一些EJB部署描述符,這是EAR中的sun-ejb-jar.xml文件包。 同樣,在答案中發布的同一篇文章中,有一個使用部署描述符章節說明
對於具有
@RolesAllowed
EJB Web服務端點,您需要通過指定要指定要使用的身份驗證類型 和 sun-ejb-jar.xml中的元素。 對於用戶名密碼驗證,請將元素設置為BASIC,如以下示例所示。 此步驟僅對EJB Web服務端點是必需的,而EJB不是必需的。
由於您正在定義EJB Web服務端點,我認為您應該將此描述符放在EAR中。 快速瀏覽一下這篇文章,它描述了你正在遵循的過程:-)
最初的問題已經過時但我仍然會留下評論以防萬一像我這樣的人偶然發現它。 從EJB 3.1開始,EJB可以打包在WAR模塊中,但是在保護它們時,需要使用EJB部署描述符。 規范中不清楚的是EJB可能不會在web.xml中聲明為Servlet,否則應用程序將無法啟動。
這是一篇關於在WAR模塊中打包EJB以及與EJB JAR模塊中的打包不同的優秀文章: http : //pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic =%2Fcom.ibm.websphere .nd.multiplatform.doc%2Finfo%2Fae%2Fae%2Fcejb_ejbinwar.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.