zoukankan      html  css  js  c++  java
  • Spring-Security自定义登录页&inMemoryAuthentication验证

      Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架。框架下内容比较多,可以做到按照角色权限对请求路径进行限制。今天主要验证自定义登录页,在内存用户存储中进行请求的权限校验。闲话休提,下面直接探讨我的验证过程,如果有比较好的意见,欢迎各位指正。

    1、系统使用Maven进行jar包管理,spring用的5.0版本。首先在pom文件中添加Spring Security的jar包依赖

      <dependency>  
                <groupId>org.springframework.security</groupId>  
                <artifactId>spring-security-core</artifactId>  
                <version>${security-version}</version>  
            </dependency>  
            <dependency>  
                <groupId>org.springframework.security</groupId>  
                <artifactId>spring-security-web</artifactId>  
                <version>${security-version}</version>  
            </dependency>  
            <dependency>  
                <groupId>org.springframework.security</groupId>  
                <artifactId>spring-security-config</artifactId>  
                <version>${security-version}</version>  
            </dependency>  

    2、添加SecurityConfig 文件,对WebSecurityConfigurerAdapter类进行扩展,重写configure方法。(WebSecurityConfigurerAdapter是对应用中安全框架的个性化定制)

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        /**
         * HTTP请求处理
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
             .formLogin().loginPage("/user/login.do")
             .defaultSuccessUrl("/free/list.do")//启用FORM登录
            .and().authorizeRequests().antMatchers("/user/login.do").permitAll()//登录页允许所有人访问
            .and().authorizeRequests().antMatchers("/**/*.do").authenticated()
            .and().httpBasic()
            .and().csrf().disable();  //暂时禁用CSRF
        }
        /**
         * 授权验证服务
         */
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            /*auth.inMemoryAuthentication()
            .withUser("simm").password("{noop}123").roles("USER").and()
            .withUser("admin").password("{noop}admin").roles("USER","ADMIN");*/
            
            auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance())
            .withUser("simm").password("123").roles("USER").and()
            .withUser("admin").password("admin").roles("USER","ADMIN");
        }
        //.and().requiresChannel().regexMatchers("^((?!/user/login).)*.do").requiresSecure()
        //.regexMatchers("^((?!/user/login).)*.do")
    }

         备注:新版本的Spring Security要求必须为用户配置提供编码器,否则会报找不到相应的编码器错误。这里有个不是很重要的知识点,假如我们没有调用passwordEncoder方法为用户验证指明编码器,那么有一种替代方案,就是在密码前加"{noop}"等前缀,跟踪源码发现,框架会自动解析{}中的key去匹配相应的编码器。下面提供一个调试的图,可以了解下。

     3、添加AppInitializer类,对AbstractSecurityWebApplicationInitializer进行扩展实现,系统启动会自动插入SpringSecurityFilter,完成对请求的安全性拦截。

    public class AppInitializer extends AbstractSecurityWebApplicationInitializer   { }

    下面截图为AbstractSecurityWebApplicationInitializer中SpringSecurityFilter的启用过程,可做参考。

     4、添加登录控制Controller。action接两个可选的请求参数error,logout。当登录失败,框架会重定向到登录页添加一个error参数。当调用/logout 退出系统时,框架在执行完退出事件,清理完身份信息后,重定向回登录页,携带一个logout参数。

    @Controller
    @RequestMapping("/user")
    // 添加session信息的注解,可以实现 session信息与map的映射 赋值
    @SessionAttributes("user")
    public class UserController {
        @RequestMapping(value = "/login", method = RequestMethod.GET)
        public String login(@RequestParam(value = "error", required = false) String error,
                @RequestParam(value = "logout", required = false) String logout,Model model) {
            if (error != null) {
                model.addAttribute("msg", "用户名或密码错误!");
            }
            if (logout != null) {
                model.addAttribute("msg", "成功退出!");
            }
            return "user/login";
        }

     5、接下来开始访问系统查看框架应用后的结果

    • 直接访问非登录页,由于没有登录,系统跳转至授权登录页面

                  

    • 验证登录失败,重定向回登录页并自动携带error参数

                   

    • 验证登录成功,重定向到成功页面

                  

    • 点击退出系统

                       

         安全性框架内容比较广泛,后面将尝试读取数据库中用户,自定义用户校验,https请求,跨站请求伪造等方面的功能。今天的内容比较简单,先作为第一波的敲门砖。

    每天都是崭新的开始 ——Mr.司满(214382122)[]~( ̄▽ ̄)~*
  • 相关阅读:
    Window安装Redis并设置为开机启动
    大佬为你揭秘微信支付的系统架构,你想知道的都在这里了
    想要设计自己的微服务?看这篇文章就对了
    破局人工智能:构建AI,与腾讯云一起探索语音应用场景
    巧用机器学习定位云服务器故障
    重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」
    5分钟内看懂机器学习和深度学习的区别
    如何防范和应对Redis勒索,腾讯云教你出招
    Redis勒索事件爆发,如何避免从删库到跑路?
    作为一个编程新手,我再也不怕Flink迷了我的眼!
  • 原文地址:https://www.cnblogs.com/MrSi/p/7993875.html
Copyright © 2011-2022 走看看