1. 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
2. 编写用户认证服务类UserDetailsServiceImpl
用户认证服务类需要复写UserDetailsService
中的UserDetails
-> loadUserByUsername(String username)
方法
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private final MageService service; // 用户信息CRUD服务类
public UserDetailsServiceImpl(MageService service) {
this.service = service;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Mage usr = service.findByName(username); // 根据username查询用户
if (usr != null) {
return new User(usr.getMageName(), usr.getMagePassword(), AuthorityUtils.NO_AUTHORITIES);
} else {
throw new UsernameNotFoundException("当前用户不存在!");
}
}
}
loadUserByUsername(String username) 方法返回的类型是UserDetails,创建UserDetails类需要传3个参数
分别是username,password,Collection<? extends GrantedAuthority> authorities
authorities是用来设置用户权限访问的,这个参数即使表中没有也不能不传,如果需求不需要设置权限,可以传AuthorityUtils.NO_AUTHORITIES,表示没权限设置
3. 编写Spring Security配置类SecurityConfig
1. Spring Security的配置类需要继承WebSecurityConfigurerAdapter
@Configuration // 声明配置类
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
2. 设置安全认证的加密方式,早期的Spring Security不是强制性的
/**
* 设置加密方式
*/
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
3. 用户认证方式
/**
* 用户认证
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
4. 安全认证的拦截和回调
前后端不分离,安全认证要做的事是拦截请求,根据配置的情况,跳转到指定页面
前后端分离,安全认证要做的事是拦截请求,根据配置的情况,返回json格式的提示信息给前端,让前端做跳转,后端就不再需要写跳转的代码了
1. 登录成功后
前后端不分离,使用.successForwardUrl() 或者.defaultSuccessUrl() 实现登录成功后的页面跳转
前后端分离,使用.successHandler()实现登录成功后向前端发送json格式的回馈信息
.formLogin()
.loginProcessingUrl("/doLogin")
.permitAll()
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException,