2017-01-08 3 views
1

У меня 4 разных типа пользователей. Каждый тип имеет собственную роль и дополнительные атрибуты. Пользователь является родительским и 3 наследниками.Несколько пользователей с Spring Security

Также я использую данные весны.

В каком режиме я могу реализовать UserDetailsService для использования 4 разных типов пользователей?

Теперь у меня есть:

@Inheritance(strategy = InheritanceType.JOINED) 
public class User implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private Long id; 
    private String username; 
    private String password; 
    private String email; 
    @ManyToMany 
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) 
    private Set<Role> roles; 

} 

И

public class Employee extends User implements Serializable { 

    private static final long serialVersionUID = 1L; 


    private String fullName; 
    @ManyToMany(mappedBy = "employees") 
    private Set<Project> projects; 
    @OneToMany(mappedBy = "employee") 
    private Set<Task> tasks; 

} 

И другие.

ответ

0

Поскольку вы говорите о UserDetailsService Я предполагаю, что вы используете Spring Security. Если вам нужно только пройти аутентификацию/авторизацию пользователей, я не уверен, что вам нужно полное управление пользователями, которое предлагает UserDetailsService. Это может быть достаточно, чтобы определить один AuthenticationProvider и запрос здесь

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(new AuthenticationProvider() { 
      @Override 
      public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
       // Do you database query here 
       ArrayList<GrantedAuthority> authorities = new ArrayList<>(); 
       authorities.add(new SimpleGrantedAuthority("ROLE_")); // list of roles from database 
       return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), 
          authentication.getCredentials(), authorities); 
      } 

      @Override 
      public boolean supports(Class<?> authentication) { 
       return true; 
      } 
     }) 
    } 
} 

Этот пример является встраиваемой и вы, вероятно, следует сделать AuthenticationProvider настоящий класс.

The AuthenticationProvider вызываются с неаутентифицированными Authentication, который был создан с помощью фильтра, обычно BasicAuthenticationFilter или UsernamePasswordAuthenticationFilter. После этого Authentication присваивается ProviderManager, которые запрашивают каждый из AuthenticationProvider, если они могут аутентифицировать этот тип Authentication (это то, что поддерживает ()). Когда найден подходящий AuthenticationProvider, его попросят подтвердить подлинность. Здесь вы просматриваете базу данных и находите роли из базы данных, а также создаете новый Authentication со списком GrantedAuthorities на основе ролей из базы данных.

Имейте в виде, что вы должны поставить «ROLE_» перед ролями (если вы не храните их в этом роде), в противном случае он не будет работать с декларативным доступом конфигурируется с помощью HttpSecurity

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
     .antMatchers("/","/home").permitAll() 
     .antMatchers("/admin/**").access("hasRole('ADMIN')") 
     // more lines 
} 

Здесь карт ADMIN к GrantedAuthority ROLE_ADMIN.

Смежные вопросы