springSecurity登陆与退出json形式交互

一 前言

本篇的内容是springSecurity登陆与退出功能,交互形式使用json格式;学习本篇的基础是知识追寻者之前发布过的文章

《springsecurity入门篇》

《springSecurity之java配置篇》

公众号:知识追寻者

知识追寻者(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
 * 

*/
@EnableWebSecurity// 开启springSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired SuccessHandler successHandler; @Autowired FailureHandler failureHandler; @Autowired OutSuccessHandler outSuccessHandler; /* * * @Author lsc *

授权

* @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
 * 

登陆成功后处理

*/
@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
 * 

登陆失败调用

*/
@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
 * 

*/
@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
 * 

*/
@RestController public class SysUserController { @GetMapping("api/test") public String test(){ return "普通用户访问"; } @GetMapping("api/admin/test") public String testAdmin(){ return "管理员访问"; } }

2.5 测试结果

登陆成功,返回josn 内容

springSecurity登陆与退出json形式交互_第1张图片

接口测试, 返回json 内容

springSecurity登陆与退出json形式交互_第2张图片

退出登陆,返回json 内容

springSecurity登陆与退出json形式交互_第3张图片

如果退出后继续访问 localhost:8080/api/test 会出现403 禁止登陆;当然如何处理 403 权限问题也是下篇内容

关注知识追寻者:
tLeP2D.png

你可能感兴趣的:(springsecurity)