springSecurity登陆与退出json形式交互(3)

x33g5p2x  于2021-08-23 转载在 Spring  
字(3.8k)|赞(0)|评价(0)|浏览(227)

一 前言

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

二 登陆与退出

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 内容

NkKqqe.png

接口测试, 返回json 内容

NkMCM8.png

退出登陆,返回json 内容

NkMKMT.png

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

相关文章