2010-02-18 89 views
10

我需要在Tomcat 6.0.24容器中保護簡單的Jersey RESTful API。我想使用基本身份驗證使用tomcat-users.xml文件來定義用戶和角色(這是現在,就像我說的那麼小)。現在Jersey,Tomcat和安全註釋

,授權我希望能夠使用JSR 250註解像@RolesAllowed@PermitAll@DenyAll

我不能爲我的生活弄清楚如何連接這一切在一起。

我真的不想去春季安全路線,因爲我目前需要的東西很簡單。

有人能指出我正確的方向嗎?

+0

既然你用'spring'和'spring-security'標記了這個問題,但你反而說你不想使用它,你真的在​​使用spring嗎?如果沒有,就把它們留下。 – BalusC 2010-02-18 23:20:05

+0

http://stackoverflow.com/questions/16433315/can-i-use-rolesallowed-on-restful-resources-implemented-on-apache-cxf – JayTee 2014-01-17 11:36:22

回答

1

您可以先使用一個涵蓋身份驗證和權限管理的過濾器開始。 通過實現ResourceFilter和ContainerRequestFilter,您可以獲得httpRequest,然後會話將您的應用程序/請求重定向到相關方法。

對於權限管理,您可以實現SecurityContext過濾器。首先要檢查isUserInRole以讓請求進入方法。

這裏是SecurityContext的實施sasmple:

public class SecurityContextImpl implements SecurityContext { 

    private final SessionUser user; 

    public SecurityContextImpl(SessionUser user) { 
     this.user = user; 
    } 

    public Principal getUserPrincipal() { 
     return user; 
    } 

    public boolean isUserInRole(String role) { 

     if(user == null) { 
      throw new AuthenticationException(); 
     } 
     if(ObjectUtil.isNull(user.getPrivileges())){ 
      throw new AuthenticationException(); 
     } 
     if(!user.getPrivileges().contains(role)) { 
      throw new InvalidAuthorizationHeaderException(); 
     } 
     return user.getPrivileges().contains(role); 
    } 

    public boolean isSecure() { 
     return false; 
    } 

    public String getAuthenticationScheme() { 
     return SecurityContext.BASIC_AUTH; 
    } 
} 

以下是基本secirtyCotnextFilter實現:

public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter { 

    private static final Logger LOG = LoggerFactory.getLogger(SecurityContextFilter.class); 

    protected static final String HEADER_AUTHORIZATION = "Authorization"; 

    protected static final String HEADER_DATE = "x-java-rest-date"; 

    protected static final String HEADER_NONCE = "nonce"; 


    private HttpServletRequest httpRequest; 




    public SecurityContextFilter() { 


    } 


    public ContainerRequest filter(ContainerRequest request) { 

     SessionUser sessionUser = (SessionUser) httpRequest 
       .getSession() 
       .getAttribute("sessionUser"); 

     request.setSecurityContext(new SecurityContextImpl(sessionUser)); 

     return request; 
    } 


    public ContainerRequestFilter getRequestFilter() { 
     return this; 
    } 

    public ContainerResponseFilter getResponseFilter() { 
     return null; 
    } 

    public HttpServletRequest getHttpRequest() { 
     return httpRequest; 
    } 

    public void setHttpRequest(HttpServletRequest httpRequest) { 
     this.httpRequest = httpRequest; 
    } 


} 

不要fotget把你的過濾器在web.xml內的init-PARAM ,

然後,您可以使用角色特權認證邏輯處理請求。