登录
前言:有的东西久了容易忘记。记录一下。点点记录
先了解登录需要做什么
- 拦截请求,否则登录没有意义了
- 登录
- 单点登录?
- 怎么验证登录
开始
- 创建springboot项目(单体项目记录轻松一点也好理解分布式了解了单体,在知道一些思路就能配出来)
- 引入jar包
<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- jwt 目前最新0.9.1 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 目的是要登录,啷个晓得是登录嘞,前端请求后端只有个地址和参数。只能从这上面验证。security有个类 WebSecurityConfigurerAdapter
@Configuration //配置
@EnableWebSecurity //启用security
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class AuthenticationConfig extends WebSecurityConfigurerAdapter {
@Autowired
JwtAuthorizationTokenFilter authenticationTokenFilter;
/**
* 功能描述: <br>
* 装载BCrypt密码编码器
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 功能描述: <br>
* 自定义拦截
*/
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests()
// 对于获取token、swagger api不拦截
.antMatchers("/login","/swagger-ui.html/**","/swagger-resources/**", "/webjars/**", "/v2/**").permitAll()
//前后端分离-前端会请求两次,一次是OPTIONS 一次才是我们的post,如果拦截会停止请求
.antMatchers(HttpMethod.OPTIONS, "/**").anonymous()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
//禁用 Spring Security 自带的跨域处理用自定义
.csrf().disable()
// 基于token,所以不要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// 禁用缓存
httpSecurity.headers().cacheControl();
// 添加JWT验证请求中的token
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
EnableGlobalMethodSecurity注解详解
这里配置是最基本的,配置了一个请求,实际WebSecurityConfigurerAdapter有多个方法,需要根据实际情况。
configure(HttpSecurity http):这个方法配置拦截
configure(WebSecurity web):配置跳过验证,会跳过配置的jwt拦截
configureGlobal(AuthenticationManagerBuilder auth):配置请求的认证,在jwt拦截之前先去这里认证一下,根据实际情况而用。
- 开启了security,拦截了请求,开始登录。
Security是一个权限框架,有权限就需要设置其他东西,这里只是登录。
我这里是:先基本的验证账号密码、查询数据、匹配密码(待会儿会说)、生成token、返回给前端。
@ApiOperation(value = "登录接口",notes = "根据用户名和密码登录")
@PostMapping(value = "/login")
public Result login(@RequestBody SysUser sysUser) {
//验证账号密码
if (StringUtils.isBlank(sysUser.getUsername()) || StringUtils.isBlank(sysUser.getPassword())){
return Result.fail("请检查账号密码");
}
//请求查询
SysUser one = sysUserService.getUser(sysUser);
//如果查询有数据-生成token
if (Optional.ofNullable(one).isPresent()){
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
if (!encoder.matches(sysUser.getPassword(),one.getPassword())){
return Result.fail("账号/密码错误");
}
//因为只是做登录不需要拿权限,不需要给Security存储用户和角色等信息
final String token = jwtTokenUtil.generateToken(String.valueOf