🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一、UserDetails UserDetails 就是封装了用户信息的对象,里面包含了七个方法; ``` public interface UserDetails extends Serializable { // 封装了权限信息 Collection<? extends GrantedAuthority> getAuthorities(); // 密码信息 String getPassword(); // 登录用户名 String getUsername(); // 帐户是否过期 boolean isAccountNonExpired(); // 帐户是否被冻结 boolean isAccountNonLocked(); // 帐户密码是否过期,一般有的密码要求性高的系统会使用到,比较每隔一段时间就要求用户重置密码 boolean isCredentialsNonExpired(); // 帐号是否可用 boolean isEnabled(); } ``` ## 二、UserDetailsService 1、需要自定义 UserDetailsService ,将用户信息和权限注入进来; 我们需要重写 loadUserByUsername 方法,参数是用户输入的用户名。返回值是UserDetails; 2、UserDetails就是SpringSecurity的认证实体的统一接口,它这是一个Java接口,一般使用它的子类org.springframework.security.core.userdetails.User,它有三个参数,分别是用户名、密码和权限集,当然,也可以自己定义UserDetails ,如下; ``` @Entity @Table(name = "sys_staff") public class SysStaff extends BaseEntity implements UserDetails {......} ``` ~~~java public interface PasswordEncoder { // 对密码进行加密 String encode(CharSequence var1); // 对密码进行判断匹配 boolean matches(CharSequence var1, String var2); } ~~~ ## 三、WebSecurityConfig 该类是 Spring Security 的最核心的配置类,该类的三个注解分别是标识该类是配置类、开启 Security 服务、开启全局 Securtiy 注解; 1、将我们自定义的 `userDetailsService` 注入进来,在 `configure()` 方法中使用 `auth.userDetailsService()` 方法替换掉默认的 userDetailsService; 2、配置登录的页面和密码的规则,以及授权使用的技术实现等。 ``` @EnableWebSecurity @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class RayWebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().and().formLogin().loginPage("/login").failureForwa rdUrl("/login-error").successForwardUrl("/index").permitAll(); } @Bean public PasswordEncoder passwordEncoder() { return RayPasswordEncoder.getInstance(); } } ``` 3、Spring Security 提供了很多种如内存方式、LDAP方式实现认证,但我们采用数据库账号角色权限表来实现;