2016-11-01 2 views
1

나는 드롭 마법사 보안 및 인증에 관한 조사를하고있었습니다. 여기에 http://howtodoinjava.com/dropwizard/dropwizard-basic-auth-security-example/을 사용한 링크가 있습니다.Dropwizard 인증 사용자

제 질문은 VALID_USERS이 (가) 정적 최종본이며 변경할 수 없으므로 새로운 사용자를 실제로 만드는 방법입니다. 나는 데이터베이스를 만드는 것에 대해 생각하고 있었고, 그것은 사용자 이름과 역할 ex를 포함하는 사용자 객체로 구성됩니다. 관리자. (나는 암호가 필요 없다) 그러나 나는 내가 무엇을 돌려 줄 것인지 혼란스러워한다. 그들의 예에서 그들은 Optional.of를 반환했다. (새로운 User (credentials.getUsername(), VALID_USERS.get (credentials.getUsername()))); 사용자 객체를 반환하겠습니까?

본질적으로 사용자 이름으로 사용자를 인증하고 권한 부여 역할을 부여하고자합니다. 관리자, 기본. 하지만 사용자 목록과 역할 목록을 생성하는 방법을 혼란스럽게 생각합니다. 나는 데이터베이스를 만들려고 생각하고 있었지만 정확히 어떻게 구현할지는 모르겠다.

public class AppBasicAuthenticator implements Authenticator<BasicCredentials, User> 
{ 
    private static final Map<String, Set<String>> VALID_USERS = ImmutableMap.of(
     "guest", ImmutableSet.of(), 
     "user", ImmutableSet.of("USER"), 
     "admin", ImmutableSet.of("ADMIN", "USER") 
    ); 

    @Override 
    public Optional<User> authenticate(BasicCredentials credentials) throws AuthenticationException 
    { 
     if (VALID_USERS.containsKey(credentials.getUsername()) && "password".equals(credentials.getPassword())) 
     { 
      return Optional.of(new User(credentials.getUsername(), VALID_USERS.get(credentials.getUsername()))); 
     } 
     return Optional.empty(); 
    } 
} 

답변

0

DropWizard의 최신 버전에서는 인증 및 권한 부여를 모두 수행 할 수 있습니다. 전자 메일은 리소스에 액세스하려고하거나 다른 신원 확인을 시도 할 때 기본 인증을 사용하는 경우 사용자에게 자격 증명을 요청하도록 DropWizard에 지시합니다. 후자는 사용자가 사용자의 역할에 따라 다양한 리소스에 액세스하도록 허용합니다.

사용자 데이터와 역할을 저장하는 다양한 방법이 있습니다. 예를 들면 언급 한 데이터베이스, LDAP 서버 및 타사 ID 관리 시스템이 있습니다.

기본 인증에 관심이 있다면 내 예제 here을 살펴볼 수 있습니다. 데이터베이스는 사용자의 자격 증명을 저장하는 데 사용됩니다. 또한 여기에 DropWizard authentication에 대한 약간의 데이트 튜토리얼이 있습니다. 최신 버전의 코드는 앞서 언급 한 예제 응용 프로그램에 있습니다.

인증 만 구현하려면 역할 추가 및 인증 자 등록을 건너 뛸 수 있습니다. 권한을 추가하려면 사용자 엔터티에 역할 컬렉션을 추가하고 Authorizer 구현과 함께 @RolesAllowed 및 @PermitAll과 같은 주석을 사용하여 리소스에 대한 액세스를 허용/거부 할 수 있습니다.

DropWizard 인증 문서에 대한 링크는 here입니다.

의견과 행운에 대해 더 많은 질문을 주시기 바랍니다.

+0

안녕하세요. 감사합니다. 저는 당신의 모범이 정말로 유용하다는 것을 알았습니다. 내가 가진 한 가지 질문은 관리자와 손님이 서로 다른 권한을 가진 두 수준의 사용자를 만드는 방법이었습니다. 당신은 저에게하는 방법에 대한 조언을 해줄 수 있습니까? – Bob

+0

아이디어는 사용자 객체에서 문자열 모음을 사용할 수 있다는 것입니다. 문자열은 실제로 역할입니다. JPA/Hibernate는 그렇게 할 수 있습니다 (http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#collections-value). 그런 다음 Authorizer를 구현해야하며, 아래의 Dropwizard 프로젝트 예제를 참조하고 애플리케이션 클래스의 run() 메소드에 등록하십시오. 그런 다음 @RolesAllowed ("ADMIN")와 같은 역할 목록을 쉼표로 구분하여 제공하는 @RolesAllowed 주석을 사용하여 메소드를 보호 할 수 있습니다. !. – javaeeeee

+0

공용 클래스는 ExampleAuthorizer는인가 자 { @Override 공공 부울 권한 부여 (사용자 사용자 문자열 역할) { 반환 user.getRoles()가 = 널 (null) && user.getRoles()가 (역할) 포함을 구현; } } 이것은 DropWizard 예제 응용 프로그램의 자동 실행 프로그램입니다. – javaeeeee