一 前言
本篇的内容是springSecurity登陆与退出功能,交互形式使用json格式;学习本篇的基础是知识追寻者之前发布过的文章
公众号:知识追寻者
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 登陆与退出
2.1 application.yml
配置账号 密码 和 拥有的角色;
spring:
security:
user:
name: zszxz
password: 123
roles: USER,ADMIN
2.2 WebSecurityConfig
关于拦截的url授权在上篇文章已经提到过,不再赘述;下面 springSecurity 配置的重点内容是 表单 登陆成功后 会 转到 successHandler
; 登陆失败 转到 failureHandler
; 退出登陆 转到 outSuccessHandler
; 三个 handler 返回的都是 json 数据, 这样就已经实现了 josn进行 前后端交互 ,当然美中不足的是 登陆还是用了springSecurity 自带的表单;我们的目的是登陆换成接口的形式,那么这个完全分离的json交互内容请看下篇文章了,不再本篇文章的讨论范围内;
/**
* @Author lsc
* <p> </p>
*/
@EnableWebSecurity// 开启springSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
SuccessHandler successHandler;
@Autowired
FailureHandler failureHandler;
@Autowired
OutSuccessHandler outSuccessHandler;
/* *
* @Author lsc
* <p> 授权</p>
* @Param [http]
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()// 授权
.antMatchers("/api/download/**").anonymous()// 匿名用户权限
.antMatchers("/api/**").hasRole("USER")//普通用户权限
.antMatchers("/api/admin/**").hasRole("ADMIN")// 管理员权限
.and()
.formLogin()// 登陆
.loginProcessingUrl("/api/login")
.successHandler(successHandler)// 登陆成功后的处理动作
.failureHandler(failureHandler)// 登陆失败后的处理动作
.permitAll() // 允许所有人访问
.and()
.logout()
.logoutSuccessHandler(outSuccessHandler)
.and()
.csrf().disable()// 关闭 csrf 否则post
.httpBasic();// http请求方式 ,web 浏览器会弹出对话框
}
}
2.3 handler
handler 这边使用 fastjson 作为json处理;
SuccessHandler
内容如下,其是实现 AuthenticationSuccessHandler 类;作用就是登陆成功后返回的内容
知识追寻者 这边设置一些CORS 和 中文乱码处理的响应头;
/**
* @Author lsc
* <p> 登陆成功后处理 </p>
*/
@Component
public class SuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
// 跨域处理
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
// 允许的请求方法
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
// 允许的请求头
httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
// 设置响应头
httpServletResponse.setContentType("application/json;charset=utf-8");
// 返回值
ResultPage result = ResultPage.sucess(CodeMsg.SUCESS, "登陆成功");
httpServletResponse.getWriter().write(JSON.toJSONString(result));
}
}
FailureHandler
实现 AuthenticationFailureHandler类, 登陆失败后的返回内容;
/**
* @Author lsc
* <p>登陆失败调用 </p>
*/
@Component
public class FailureHandler implements AuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
// 返回值
ResultPage result = ResultPage.error(CodeMsg.ACCOUNT_ERROR);
httpServletResponse.getWriter().write(JSON.toJSONString(result));
}
}
OutSuccessHandler
实现 LogoutSuccessHandler ,即退出登陆后返回的内容;
/**
* @Author lsc
* <p> </p>
*/
@Component
public class OutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
// 设置响应头
httpServletResponse.setContentType("application/json;charset=utf-8");
// 返回值
ResultPage result = ResultPage.sucess(CodeMsg.SUCESS,"退出登陆成功");
httpServletResponse.getWriter().write(JSON.toJSONString(result));
}
}
2.4 控制层
控制层主要是定义一个接口进行测试
/**
* @Author lsc
* <p> </p>
*/
@RestController
public class SysUserController {
@GetMapping("api/test")
public String test(){
return "普通用户访问";
}
@GetMapping("api/admin/test")
public String testAdmin(){
return "管理员访问";
}
}
2.5 测试结果
登陆成功,返回josn 内容
接口测试, 返回json 内容
退出登陆,返回json 内容
如果退出后继续访问 localhost:8080/api/test 会出现403 禁止登陆;当然如何处理 403 权限问题也是下篇内容
关注知识追寻者: