2010-02-18 4 views
10

Мне нужно обеспечить простой API Джерси RESTful в контейнере Tomcat 6.0.24. Я хотел бы сохранить аутентификацию с помощью Basic Authentication, используя файл tomcat-users.xml, чтобы определить пользователей и роли (сейчас это, как я уже сказал, мало).Джерси, Tomcat и Security Аннотации

Теперь для авторизации Я хотел бы, чтобы иметь возможность использовать JSR 250 аннотаций как @RolesAllowed, @PermitAll, @DenyAll и т.д.

Я не могу за жизнь мне понять, как подключить все это вместе ,

Я действительно не хочу идти по пути безопасности Spring, так как мне нужно что-то очень простое в текущее время.

Может кто-нибудь указать мне в правильном направлении?

+0

Поскольку вы отметили этот вопрос словами 'spring' и' spring-security', но вместо этого вы заявили, что не хотите его использовать, действительно ли вы используете весну? Если нет, просто оставьте их. – BalusC

+0

http://stackoverflow.com/questions/16433315/can-i-use-rolesallowed-on-restful-resources-implemented-on-apache-cxf – JayTee

ответ

1

Вы можете начать с использования фильтра, который сначала включает проверку подлинности и управление привилегиями. с реализацией ResourceFilter и ContainerRequestFilter, вы можете получить httpRequest, затем сеансы перенаправляют ваше приложение/запросы на связанные методы.

Для управления привилегиями вы можете реализовать фильтр SecurityContext. вы должны сначала проверить isUserInRole, чтобы позволить пропустить метод входа внутрь.

Вот sasmple для реализации SecurityContext:

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, чтобы поставить фильтр как Init-парам внутри web.xml ,

Затем вы можете обрабатывать запрос с помощью вашей логики с полномочиями по привилегии role-privilege-authenticaiton.