복붙노트

[SPRING] Spring Security 플러그인으로 기존 도메인 클래스 사용

SPRING

Spring Security 플러그인으로 기존 도메인 클래스 사용

Stripes 웹 앱을 Grails로 변환하려고합니다. The Stripes app은 Spring Security를 ​​사용하지만 Grails 앱이 Spring Security Grails 플러그인을 사용하기를 원합니다.

앱에 이미 재사용해야하는 사용자 및 역할 (Java) 클래스가 있습니다. 즉, s2-quickstart 스크립트가 생성하는 Grails 도메인 클래스를 사용할 수 없습니다.

Spring Security 플러그인 문서는 기존 사용자 도메인 클래스를 사용하는 방법을 설명합니다. 단계는 다음과 같습니다.

그러나 문서에서는 기존 역할 클래스를 사용하는 방법과 사용자와 역할 간의 다 대다 관계를 나타내는 클래스에 대한 정보는 제공하지 않습니다.

기존 Role, User, UserRole 클래스를 Grails Spring Security 플러그인과 함께 사용하기 위해 필요한 다른 단계는 무엇입니까? 도메인 클래스를 생성하고 싶지 않으면 s2-quickstart 스크립트를 실행해야 할 이유가 있습니까?

아마도 GrailsUser는 사용자 정의 UserDetails 구현을 의미할까요? 제 경우에는 인터페이스를 직접 구현할 것입니다. 이 같은 것이 합리적으로 보입니까?

class UserAdapter implements UserDetails {
  private String password  
  private Collection<GrantedAuthority> springRoles

  UserAdapter(User user) {
    this.password = user.password

    Collection<Role> roles = // load legacy Role objects
    this.springRoles = roles.collect { new GrantedAuthorityImpl(it.authority) }
  }      

  // If using password hashing, presumably this is the hashed password?
  String getPassword() {
    password  
  }

  ///////// other UserDetails methods omitted

  Collection<GrantedAuthority> getAuthorities() {
    springRoles
  }
}

HTTP 세션에서 잠재적으로 큰 객체를 저장하는 것에 대한 경고 때문에 UserAdapter 내에 전체 User 객체를 저장하지 않습니다.

위와 같이 자신 만의 UserDetails 구현을 사용하면 아마 id 제공에 대한이 설명을 무시할 수 있습니까?

마지막으로 위에서 설명한 접근법을 따르면 Config.groovy에 이러한 속성을 설정해야하며 s2-quickstart 스크립트 (또는 다른 스크립트)를 실행해야합니까?

해결법

  1. ==============================

    1.스프링 보안은 데이터의 출처를 신경 쓰지 않는다. DAO 인증 공급자로 인증 할 때 UserDetails 인스턴스 만 있으면 어디에서나 올 수있다. 도메인 클래스와 데이터베이스 테이블을 사용하는 것이 편리하지만 한 가지 방법 일뿐입니다. 귀하의 데이터에 적합한 것을하십시오. 결국 사용자 이름과 암호가 설정된 새로운 GrailsUser (또는 다른 impl) 인스턴스, 3 개의 부울 집합, GrantedAuthority 인스턴스 목록 (GrailsUser 인 경우 ID)이 필요합니다.

    스프링 보안은 데이터의 출처를 신경 쓰지 않는다. DAO 인증 공급자로 인증 할 때 UserDetails 인스턴스 만 있으면 어디에서나 올 수있다. 도메인 클래스와 데이터베이스 테이블을 사용하는 것이 편리하지만 한 가지 방법 일뿐입니다. 귀하의 데이터에 적합한 것을하십시오. 결국 사용자 이름과 암호가 설정된 새로운 GrailsUser (또는 다른 impl) 인스턴스, 3 개의 부울 집합, GrantedAuthority 인스턴스 목록 (GrailsUser 인 경우 ID)이 필요합니다.

    레거시 사용자 및 역할 데이터가있을 때 가장 간단한 방법은 사용자 지정 UserDetailsService를 만드는 것입니다. GORM, 원시 SQL 쿼리를 사용하여 필요한 데이터를 얻는 데 필요한 모든 것이 있습니다.

    또 다른 옵션은 Glen이 여기에서했던 것처럼 자신의 AuthenticationProvider를 작성하는 것입니다. http://blogs.bytecode.com.au/glen/2010/01/15/hacking-custom-authentication-providers-with-grails-spring-security.html -이 솔루션은 사용자 정의 필터가 필요없는 큰 솔루션입니다. DAO 공급자는 UserDetailsService를 사용하지만 기능을 하나의 클래스로 결합한 자체 함수를 만드는 것이 좋습니다.

    사용자 도메인 클래스를 UserDetails로 재사용하는 것은 좋지 않습니다. 인터페이스를 구현하더라도 HTTP 세션에 연결되어 있지 않은 큰 (연결되어있는 콜렉션이있는 경우) 객체를 저장하게됩니다. POJO / POGO 구현 (Spring Security의 User 클래스, 플러그인의 GrailsUser 클래스 등)은 매우 작고 문자열과 부울은 매우 작습니다.

  2. ==============================

    2.config.groovy 파일 내에서 사용할 도메인 클래스를 지정해야합니다.

    config.groovy 파일 내에서 사용할 도메인 클래스를 지정해야합니다.

    grails.plugins.springsecurity.userLookup.userDomainClassName = 'your.package.User'
    grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'your.package.UserRole'
    grails.plugins.springsecurity.authority.className = 'your.package.Role'
    

    스프링 보안이 사용하기 때문에 자신의 사용자 디테일 서비스를 구현할 필요가 없다고 생각합니다.

    SpringSecurityUtils.securityConfig.userLookup
    

    메서드를 사용하여 이전에 구성한 도메인 클래스를 확인합니다. 도메인 클래스는 필수 필드와 관계를 제공해야합니다.

  3. from https://stackoverflow.com/questions/6899566/use-existing-domain-classes-with-spring-security-plugin by cc-by-sa and MIT license