1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.启动时会提供一个默认密码
3.在访问一个接口的时候,需要先进行认证(先跳转到此页面)才能进行访问
http://localhost:8080/info_provider/boat_position/record/history?shipName=白洋淀001&interval=2
4.security本质上是一个过滤器链(很多过滤器),还记得doFileter方法吗?
FilterSecurityInterceptor :是一个方法级的权限过滤器,基本位于过滤链的最就部
ExceptionTranslationFilter :是个异常过滤器,用来处理在认证授权过程中抛出的异常
UsernamePasswordAuthenticationFilter :对/login的POST请求做拦截,校验表单中用户名,密码。
5.两大接口
5.1 UserDetailsService接口讲解
- 当什么也没有配置的时候,账号和密码是由Spring Security定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。
- 如果需要自定义逻辑时,只需要实现 UserDetailsService 接口,并实现loadUserByUsername方法。
@Service
public class ShipManageServiceImpl extends UsernamePasswordAuthenticationFilter implements IShipManageService, UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null;
}
}
security提供了一个User类,可以设置一些权限
public User(String username, String password, Collection<? extends GrantedAuthority> authorities) {
this(username, password, true, true, true, true, authorities);
}
5.2 PasswordEncoder
数据加密接口,用于返回User对象里面密码加密。security只认这一种方式,别的不认。
可以自定义一个Security的工具类,然后自己写函数去调用,就不用每一次重复写代码。
/**
* 权限获取工具类
*
* @author tjj
*/
public class SecurityUtils
{
//省略。。。。,处理token等等之类的
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password)
{
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword)
{
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
}
5.3 使用
创建类继承UsernamePasswordAuthenticationFilter,重写三个方法。
创建类实现UserDetailService,编写查询数据过程,返回User对象,这个User对象是安全框架提供对象。