我一直在嘗試使用註釋而不是部署描述符將應用程序部署到glassfish 3。但是,我一直無法正常工作。如果我嘗試訪問該服務,我結束了一個服務器錯誤500,顯示此消息:使用註釋基本身份驗證來保護Glassfish REST服務
type Exception report
message
descriptionThe server encountered an internal error() that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: javax.ejb.AccessLocalException: Client not authorized for this invocation
root cause
javax.ejb.AccessLocalException: Client not authorized for this invocation
的EJB看起來是這樣的:
@Path("/myresource")
@Stateless
@RolesAllowed("user-role")
public class MyResource {
@GET
@Path("/{uuid}")
public Response getData(@PathParam("uuid") final String uuid) {
....
}
}
sun-web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN"
"http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd">
<sun-web-app>
<security-role-mapping>
<role-name>user-role</role-name>
<group-name>user-group</group-name>
</security-role-mapping>
</sun-web-app>
這是在web.xml:
<web-app id="myservice" version="2.5" 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_2_5.xsd">
<display-name>org.test.myservice</display-name>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.test.myservice.rest</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>file</realm-name>
</login-config>
<security-role>
<role-name>user-role</role-name>
</security-role>
</web-app>
glassfish中的文件領域使用sun-web.xml中指定的用戶和角色進行設置,並且在通過部署描述符設置應用程序安全性時一直運行良好。
如果我正確理解這個文檔,我不必鏈接安全角色引用,如果他們的名字是相同的。 http://docs.oracle.com/javaee/5/tutorial/doc/bnbyl.html#bnbyt 任何想法我失蹤?
編輯 相關的不能夠指定與註釋所需的信息的問題,是有另外一個問題,這引起了我的思考這個問題。也許這會使最初的問題更清楚一些: 上面舉例說明,resource/myresource/*僅適用於角色爲'user-role'的用戶。但是,如果在path/myresource/*/thumbnail上存在第二個資源(轉換爲/ myresource/[uuid]/thumbnail),則應該在沒有身份驗證的情況下使用這個資源,因爲使用url-mapping指定安全約束是不可能的,因爲它似乎不可能在常量之間使用通配符。但是,通過指定允許通過註釋訪問方法的角色,這將是可行的。如上所述,我還沒有做到。這樣的映射怎麼可能完成?
您如何訪問寧靜的Web服務MyResource?直接從客戶端?或者在服務器端內部? (如何)你是否認證了客戶? – perissf
我使用瀏覽器訪問它,因爲它只是一個獲取請求。但是,我們也有測試,它們使用apache http客戶端來訪問資源。客戶端應通過基本身份驗證進行身份驗證。所以,瀏覽器應該自動顯示一個彈出窗口。 apache http客戶端被配置爲發送憑據。我只是做了更多的測試。只要我從舊的web.xml中刪除安全約束部分,我就會發現http 500錯誤。這對我來說沒有任何意義... –
您是否在web.xml中添加了安全約束元素? – perissf