美文网首页
SpringBoot整合Spring Security登录表单详

SpringBoot整合Spring Security登录表单详

作者: 伍陆柒_ | 来源:发表于2019-10-18 10:15 被阅读0次

    部分引自 www.javaboy.org
    formLogin这里还可以配置详细一点

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("yzn").password("123").roles("admin")
                    .and()
                    .withUser("test").password("123").roles("user");
        }
    
        @Bean
        PasswordEncoder passwordEncoder(){
            return NoOpPasswordEncoder.getInstance();
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/admin/**").hasRole("admin")
                    .antMatchers("/user/**").hasAnyRole("admin", "user")
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
                    // 登录处理接口
                    .loginProcessingUrl("/doLogin")
                    // 定义登录页面,未登录时,访问一个需要登录之后才能访问的接口,会自动跳转到该页面
                    .loginPage("/login")
                    //定义登录时,用户名的 key,默认为 username
                    .usernameParameter("uname")
                    //定义登录时,用户密码的 key,默认为 password
                    .passwordParameter("passwd")
                    //登录成功的处理器
                    .successHandler(new AuthenticationSuccessHandler() {
                        @Override
                        public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication authentication) throws IOException, ServletException {
                            res.setContentType("application/json;charset=utf-8");
                            PrintWriter out = res.getWriter();
                            out.write("success");
                            out.flush();
                        }
                    })
                    .failureHandler(new AuthenticationFailureHandler() {
                        @Override
                        public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse res, AuthenticationException e) throws IOException, ServletException {
                            res.setContentType("application/json;charset=utf-8");
                            PrintWriter out = res.getWriter();
                            out.write("fail");
                            out.flush();
                        }
                    })
                    //和表单登录相关的接口统统都直接通过
                    .permitAll()
                    .and()
                    .csrf().disable();
        }
    }
    
    @RestController
    public class HelloController {
    
        @GetMapping("/hello")
        public String hello() {
            return "hello";
        }
    
        @GetMapping("/admin/hello")
        public String admin() {
            return "hello admin";
        }
    
        @GetMapping("/user/hello")
        public String user() {
            return "hello user";
        }
    
        @GetMapping("/login")
        public String login() {
            return "please login!!!";
        }
    }
    

    利用postman测试

    image.png

    注销表单配置

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                    .withUser("yzn").password("123").roles("admin")
                    .and()
                    .withUser("test").password("123").roles("user");
        }
    
        @Bean
        PasswordEncoder passwordEncoder(){
            return NoOpPasswordEncoder.getInstance();
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/admin/**").hasRole("admin")
                    .antMatchers("/user/**").hasAnyRole("admin", "user")
                    .anyRequest().authenticated()
                    .and()
                    .formLogin()
                    // 登录处理接口
                    .loginProcessingUrl("/doLogin")
                    // 定义登录页面,未登录时,访问一个需要登录之后才能访问的接口,会自动跳转到该页面
                    .loginPage("/login")
                    //定义登录时,用户名的 key,默认为 username
                    .usernameParameter("uname")
                    //定义登录时,用户密码的 key,默认为 password
                    .passwordParameter("passwd")
                    //登录成功的处理器
                    .successHandler(new AuthenticationSuccessHandler() {
                        @Override
                        public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication authentication) throws IOException, ServletException {
                            res.setContentType("application/json;charset=utf-8");
                            PrintWriter out = res.getWriter();
                            Map<String,Object> map = new HashMap();
                            map.put("status", 200);
                            // authentication.getPrincipal() 可以把登录者信息取出来
                            map.put("msg", authentication.getPrincipal());
                            out.write(new ObjectMapper().writeValueAsString(map));
                            out.flush();
                        }
                    })
                    .failureHandler(new AuthenticationFailureHandler() {
                        @Override
                        public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse res, AuthenticationException e) throws IOException, ServletException {
                            res.setContentType("application/json;charset=utf-8");
                            PrintWriter out = res.getWriter();
                            Map<String,Object> map = new HashMap();
                            map.put("status", 401);
                            map.put("msg", "failed");
                            out.write(new ObjectMapper().writeValueAsString(map));
                            out.flush();
                        }
                    })
                    //和表单登录相关的接口统统都直接通过
                    .permitAll()
                    .and()
                    .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessHandler(new LogoutSuccessHandler() {
                        @Override
                        public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse res, Authentication authentication) throws IOException, ServletException {
                            res.setContentType("application/json;charset=utf-8");
                            PrintWriter out = res.getWriter();
                            Map<String,Object> map = new HashMap();
                            map.put("status", 200);
                            map.put("msg", "注销登录成功");
                            out.write(new ObjectMapper().writeValueAsString(map));
                            out.flush();
                        }
                    })
                    .and()
                    .csrf().disable();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:SpringBoot整合Spring Security登录表单详

          本文链接:https://www.haomeiwen.com/subject/iesqpctx.html