具有Spring Security的多个用户
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有Spring Security的多个用户相关的知识,希望对你有一定的参考价值。
我有4种不同类型的用户。每种类型都有自己的角色和附加属性。用户是父,3是继承人。
我也使用Spring Data。
我可以通过哪种方式实现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;
}
和别的。
既然你在谈论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
变成一个真正的类。
AuthenticationProvider
被称为未经验证的Authentication
,由过滤器创建,通常是BasicAuthenticationFilter
或UsernamePasswordAuthenticationFilter
。在此之后,Authentication
被给予ProviderManager
,AuthenticationProvider
询问每个Authentication
是否可以验证这种类型的AuthenticationProvider
(这是支持()方法的用途)。一旦找到合适的Authentication
,就会要求它进行身份验证 - 这是您进行数据库查找并从数据库中查找角色的位置,并根据数据库中的角色构建一个包含GrantedAuthorities
列表的新HttpSecurity
。
请注意,您应该将“ROLE_”放在角色的前面(除非您将它们存储起来),否则它将不适用于使用@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/","/home").permitAll()
.antMatchers("/admin/**").access("hasRole('ADMIN')")
// more lines
}
配置的声明性访问
GrantedAuthority
这里ADMIN映射到qazxswpoi ROLE_ADMIN。
以上是关于具有Spring Security的多个用户的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 具有不同用户详细信息的多个 HTTPSecurity 服务在 Spring Boot 中不起作用
具有会话获取在线用户的 Spring Security 返回空
具有多个 Active Directory 服务器的 Grails Spring Security LDAP 插件
防止 Spring Security 通过下一个身份验证提供程序对具有 BadCredentialException 的用户进行身份验证