• 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
     * <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 权限问题也是下篇内容

    关注知识追寻者:
    tLeP2D.png

  • 相关阅读:
    javaSE第十五天
    javaSE第十四天
    javaSE第十三天
    javaSE第十二天
    javaSE第十一天
    javaSE第十天
    javaSE第九天
    python011 Python3 字典
    python010 Python3 元组
    python009 Python3 列表
  • 原文地址:https://www.cnblogs.com/zszxz/p/13144053.html
Copyright © 2020-2023  润新知