java - 使用 Spring Security 的多个用户

标签 java spring spring-boot spring-security spring-data

我有 4 种不同类型的用户。每种类型都有自己的角色和附加属性。 用户是父级,还有 3 个继承者。

我还使用 Spring Data。

我可以通过什么方式实现 UserDetailsS​​ervice 来使用 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;

}

还有其他。

最佳答案

既然您正在谈论UserDetailsS​​ervice,我假设您使用Spring Security。如果您只需要对用户进行身份验证/授权,我不确定您是否需要 UserDetailsS​​ervice 提供的完整用户管理。定义一个 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 设为一个真正的类。

使用未经身份验证的Authentication调用AuthenticationProvider,该身份验证是由过滤器(通常是BasicAuthenticationFilterUsernamePasswordAuthenticationFilter)创建的。此后,Authentication 被提供给 ProviderManager,后者询问每个 AuthenticationProvider 是否可以验证这种类型的 Authentication(这就是 supports() 方法的用途)。找到合适的 AuthenticationProvider 后,系统会要求其进行身份验证 - 您可以在此处进行数据库查找并从数据库中查找角色,并根据数据库中的角色使用 GrantedAuthorities 列表构建新的 Authentication

请注意,您应该将“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。

关于java - 使用 Spring Security 的多个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41535893/

相关文章:

java - 即使在 Springboot 应用程序的过滤器内指定 Access-Control-Allow-Origin header 后,也无法控制跨源请求

java - 无法访问 AWS Tomcat 上的 MySQL 数据库,但可以在本地 Tomcat 上正常工作。 (JDBS 连接错误)

java - LibGdx FPS 太多了。如何限制?

java - 我收到错误 : '.class' expected

java - 按元素将列表拆分为 block

java - getApplicationContext() 不适用于使用 AsyncTask 进行 JobService 的 JobScheduler

java - 如何向外部 Rest Api 发出 Http Post 请求?

spring - 结合 Spring HTTP Basic Authentication 和 Access Token

Java Spring Data @EnabledJPARepositories 问题

java - 按执行顺序列出给定进程的所有任务