2013-05-18 3 views
0

저지 서비스를 사용하면 사용자 이름과 암호 이상으로 사용자를 인증하는 가장 우아한 방법은 무엇입니까? 비즈니스 ID 및 사용자 이름을 주체로, 암호를 유일한 자격 증명으로 사용합니다.JAX-RS : 여러 사용자 (사용자 이름 이상)로 인증

사용자 테이블이있는 postgres DB가 있는데 여러 비즈니스 엔터티에 동일한 사용자 이름 문자열이있을 수 있습니다. 고유 제한 조건은 비즈니스 ID와 사용자 이름이 함께있는 두 개의 열에 속합니다.

I 클라이언트가 비즈니스 ID에 대해 추가 HTTP 헤더를 보내도록 기본 인증을 사용합니다. 나는 여기서 어떻게 할까?

이제 인증과 관련하여 역할이 각 비즈니스 엔터티에 대해 특별히 만들어지면 (각 비즈니스는 자신의 역할을 정의하고 권한에 연결할 수 있음) 역할과 사용 권한을 설정하는 방법은 무엇입니까? 권한은 정적입니다.

apache shiro (또는 다른 플러그 형 보안 확장 프로그램)가이 경우 해결책을 제시합니까?

감사합니다.

답변

1

  1. 좋은 이전 서블릿 필터에서 인증 논리를 구현하십시오. JAX-RS 응용 프로그램은 일반적인 WWW 응용 프로그램이므로 필터는 간단한 인증 메커니즘으로 적합합니다.

  2. JAX-RS와 함께 작업하는 동안 ("호출기 데이터베이스 등") 필요에 따라 인증 논리를 구현할 수있는 JAX-RS 요격기 (PreProcessInterceptor).

  3. Spring Security을 사용하십시오. 스프링 프레임 워크를 배울 준비가 되었다면 좋은 옵션입니다. Spring Security는 모든 기능을 갖춘 인증 및 액세스 제어 메커니즘을 제공하므로 필요한 모든 것을 구현할 수 있습니다. 나머지 응용 프로그램에서는 Spring을 사용하지 않습니다.

  4. auth 논리를 구현하는 데 CDI 데코레이터 (example)를 사용할 수도 있지만, 여전히 CDI 채택률이 낮은 특정 종류의 것입니다.

개인적으로 나는 단순한 경우에는 1, 2보다 진보 된 경우에는 3으로 갈 것입니다.

+0

1, 2 나는 서블릿 필터 내 자신의 인증 방법을 구현하는 데, 피하려고 정확히 무엇인가. 하지만 나는 다른 선택의 여지가 없다고 생각합니다. Shiro/Spring을 인증 및 승인 요구 사항에 맞게 "구부릴"방법을 찾지 못했습니다. –

1

(오래된 질문 새 사용자에 대한 응답!) 당신이 당신의 질문에 시로 태그로서, 당신은 단지
org.apache.shiro.realm.jdbc.JdbcRealm
을 extanding 및 @Override하여 자신의 논리를 추가 할 수는 :

:
getRoleNamesForUser(...) , getPermissions(..), doGetAuthenticationInfo(..)
이 예입니다
@Override 
protected Set<String> getRoleNamesForUser(Connection conn, String username) throws SQLException { 
    Set<String> roleNames = new LinkedHashSet<>(); 

    Collection<UserRole> roles = /* Get roles from your DB, this example use JPA entity, **but you put here any logic you want**...*/ 
    for(UserRole userRole:roles){ 
     roleNames.add(userRole.getRole().getName()); 
    } 
    return roleNames; // return roles so Shiro is 'aware' of roles to add them to current user 
} 

* 재정의 한 다른 방법에도 동일한 논리가 적용됩니다.
** 사용자를 기록하기 위해 2 번의 http 호출이 필요하지 않습니다. 사용자는 Shiro 프로그램 인증을 사용할 수 있습니다. 여기

시로 주석 enabled..and 더와 Complete example입니다