来写一个类,实现UserDetailService并实现它的方法
//把类交给spring容器管理 @Component public class SecurityDetail implements UserDetailsService { @Autowired private UserInfoDao userInfoDao; @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { UserInfo userInfo = null; //UserDetails接口的实现类 User user = null; //判断用户名不为空 if (s != null) { //根据用户名查找用户 userInfo = userInfoDao.findByUsername(s); //判断用户不为空 if (userInfo != null) { //User类的第三个参数是集合,所有创建一个集合,获取用户的角色 List<GrantedAuthority> list = new ArrayList<>(); //获取用户的角色,获取到的角色开头一定要以"ROLE_"开头 GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_" + userInfo.getRoles()); list.add(authority); //User的构造器要返回三个参数:用户名、密码、集合的角色 user = new User(userInfo.getUsername(), userInfo.getPassword(), list); } } return user; } }再写一个配置类,解析密码的加密方式
@Configuration @EnableWebSecurity //开启方法级别的验证 @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private SecurityDetail securityDetail; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //密码加密的方式 auth.userDetailsService(securityDetail).passwordEncoder(new BCryptPasswordEncoder()); } }现在可以进行测试了,启动项目,访问控制层的方法,只有方法上标记的角色才能访问该方法
2.认证和授权authentication:认证,认证访问的用户是不是有效的用户,他是谁。
authorization:授权,访问的用户在系统中能干什么
RBAC:基于角色的访问控制(Role-Based Access Control),用户属于某个角色,而角色拥有某些权限。
权限:能对资源进行操作,比如增删改查
角色:自定义的,表示权限的聚合,一个角色可以有多个权限。
举例说明:
设计角色:经理具有数据的修改、删除、查看等;员工只能查看数据。
一个公司中如果想把一个用户设置为经理,只需把他设置为经理这个角色,他就能有修改、删除、查看等操作了,如果公司新来普通员工,只需把他加入到员工这个角色里面就好了。这样,想让什么用户用户什么权限,只需把他加入到相应的角色里就OK了。
UserDetailService:这是一个接口,里面只有一个方法UserDetails loadUserByUsername(String var1),是根据用户名来获取数据库中信息的
主要的实现有:
InMemoryUserDetailsManager在内存中维护用户信息的,使用很方便,可是数据不是持久的
JdbcUserDetailsManager对数据库信息进行操作的,底层是基于jdbcTemplate的,可以使用这个类的方法来操作数据库数据。
UserDetails:提供用户信息的核心接口
// 权限的集合 Collection<? extends GrantedAuthority> getAuthorities(); //获取密码 String getPassword(); //获取用户名 String getUsername(); //用户是否存在 boolean isAccountNonExpired(); //用户是否锁定 boolean isAccountNonLocked(); //证书是否过期 boolean isCredentialsNonExpired(); //账户是否启用 boolean isEnabled();UserDetails有一个实现类User
//他有两个构造器,参数和UserDetails的字段属性一样 public User(String username, String password, Collection<? extends GrantedAuthority> authorities) { this(username, password, true, true, true, true, authorities); } public User(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) { if (username != null && !"".equals(username) && password != null) { this.username = username; this.password = password; this.enabled = enabled; this.accountNonExpired = accountNonExpired; this.credentialsNonExpired = credentialsNonExpired; this.accountNonLocked = accountNonLocked; this.authorities = Collections.unmodifiableSet(sortAuthorities(authorities)); } else { throw new IllegalArgumentException("Cannot pass null or empty values to constructor"); } } 2.1设置表