原文地址:https://412887952-qq-com.iteye.com/blog/2299784

(6). Shiro记住密码

      记住密码实现起来也是比较简单的,主要看下是如何实现的。

在com.kfit.config.shiro.ShiroConfiguration加入两个方法:

/**

     * cookie对象;

     * @return

     */

    @Bean

    public SimpleCookie rememberMeCookie(){

       System.out.println("ShiroConfiguration.rememberMeCookie()");

       //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe

       SimpleCookie simpleCookie = new SimpleCookie("rememberMe");

       //<!-- 记住我cookie生效时间30天 ,单位秒;-->

       simpleCookie.setMaxAge(259200);

       returnsimpleCookie;

    }

   

    /**

     * cookie管理对象;

     * @return

     */

    @Bean

    public CookieRememberMeManager rememberMeManager(){

       System.out.println("ShiroConfiguration.rememberMeManager()");

       CookieRememberMeManager cookieRememberMeManager = newCookieRememberMeManager();

       cookieRememberMeManager.setCookie(rememberMeCookie());

       returncookieRememberMeManager;

    }

 

将rememberMeManager注入到SecurityManager中

@Bean

    public SecurityManager securityManager(){

        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();

       //设置realm.

       securityManager.setRealm(myShiroRealm());

      

       //注入缓存管理器;

       securityManager.setCacheManager(ehCacheManager());//这个如果执行多次,也是同样的一个对象;

      

       //注入记住我管理器;

       securityManager.setRememberMeManager(rememberMeManager());

      

       returnsecurityManager;

    }

 

在ShiroFilterFactoryBean添加记住我过滤器:

@Bean

    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){

       System.out.println("ShiroConfiguration.shirFilter()");

       ShiroFilterFactoryBean shiroFilterFactoryBean  = new ShiroFilterFactoryBean();

      

        // 必须设置 SecurityManager 

       shiroFilterFactoryBean.setSecurityManager(securityManager);

      

      

      

       //拦截器.

       Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();

      

       //配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了

       filterChainDefinitionMap.put("/logout", "logout");

      

      

       //配置记住我或认证通过可以访问的地址

        filterChainDefinitionMap.put("/index", "user");

        filterChainDefinitionMap.put("/", "user");

      

      

       //<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;

        //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->

       filterChainDefinitionMap.put("/**", "authc");

      

       // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

        shiroFilterFactoryBean.setLoginUrl("/login");

        // 登录成功后要跳转的链接

        shiroFilterFactoryBean.setSuccessUrl("/index");

        //未授权界面;

        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

      

       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

       returnshiroFilterFactoryBean;

    }

 

主要是加入了:

//配置记住我或认证通过可以访问的地址

 filterChainDefinitionMap.put("/index", "user");

 filterChainDefinitionMap.put("/", "user");

 

修改登录界面加入rememberMe复选框:

在login.html中加入:

<P><input type="checkbox" name="rememberMe" />记住我</P>

 

这时候运行程序,登录之后跳转到/index页面,然后我们关闭浏览器,然后直接访问/index还是可以访问的,说明我们写的记住密码已经生效了,如果访问http://127.0.0.1:8080/userInfo/userAdd 的

话还是需要重新登录的。

      至此spring boot集成shiro就真的告一段落了。

当然shiro还是博大精深的,还有很多需要大家去研究,在这里博主抛出几个问题(当然博主自己已经实现了):

问题1:如何在登录的时候加入验证码校验;

问题2:如何在thymleaf使用shiro标签,比如:shiro:hasPermission;

问题3:如何限制密码输错3次就不能登录了;

问题4:如何编写无状态的过滤器;

问题5:在同一个工程中如何有状态和无状态的过滤器同时并存;

(6). Shiro记住密码

      记住密码实现起来也是比较简单的,主要看下是如何实现的。

com.kfit.config.shiro.ShiroConfiguration加入两个方法:

/**

     * cookie对象;

     @return

     */

    @Bean

    public SimpleCookie rememberMeCookie(){

       System.out.println("ShiroConfiguration.rememberMeCookie()");

       //这个参数是cookie的名称,对应前端的checkboxname = rememberMe

       SimpleCookie simpleCookie = new SimpleCookie("rememberMe");

       //<!-- 记住我cookie生效时间30 ,单位秒;-->

       simpleCookie.setMaxAge(259200);

       returnsimpleCookie;

    }

   

    /**

     * cookie管理对象;

     @return

     */

    @Bean

    public CookieRememberMeManager rememberMeManager(){

       System.out.println("ShiroConfiguration.rememberMeManager()");

       CookieRememberMeManager cookieRememberMeManager = newCookieRememberMeManager();

       cookieRememberMeManager.setCookie(rememberMeCookie());

       returncookieRememberMeManager;

    }

 

rememberMeManager注入到SecurityManager

@Bean

    public SecurityManager securityManager(){

        DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();

       //设置realm.

       securityManager.setRealm(myShiroRealm());

      

       //注入缓存管理器;

       securityManager.setCacheManager(ehCacheManager());//这个如果执行多次,也是同样的一个对象;

      

       //注入记住我管理器;

       securityManager.setRememberMeManager(rememberMeManager());

      

       returnsecurityManager;

    }

 

ShiroFilterFactoryBean添加记住我过滤器:

@Bean

    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){

       System.out.println("ShiroConfiguration.shirFilter()");

       ShiroFilterFactoryBean shiroFilterFactoryBean  new ShiroFilterFactoryBean();

      

        // 必须设置 SecurityManager 

       shiroFilterFactoryBean.setSecurityManager(securityManager);

      

      

      

       //拦截器.

       Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();

      

       //配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了

       filterChainDefinitionMap.put("/logout""logout");

      

      

       //配置记住我或认证通过可以访问的地址

        filterChainDefinitionMap.put("/index""user");

        filterChainDefinitionMap.put("/""user");

      

      

       //<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;

        //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->

       filterChainDefinitionMap.put("/**""authc");

      

       // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面

        shiroFilterFactoryBean.setLoginUrl("/login");

        // 登录成功后要跳转的链接

        shiroFilterFactoryBean.setSuccessUrl("/index");

        //未授权界面;

        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

      

       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

       returnshiroFilterFactoryBean;

    }

 

主要是加入了:

//配置记住我或认证通过可以访问的地址

 filterChainDefinitionMap.put("/index""user");

 filterChainDefinitionMap.put("/""user");

 

修改登录界面加入rememberMe复选框:

login.html中加入:

<P><input type="checkbox" name="rememberMe" />记住我</P>

 

这时候运行程序,登录之后跳转到/index页面,然后我们关闭浏览器,然后直接访问/index还是可以访问的,说明我们写的记住密码已经生效了,如果访问http://127.0.0.1:8080/userInfo/userAdd 

话还是需要重新登录的。

      至此spring boot集成shiro就真的告一段落了。

当然shiro还是博大精深的,还有很多需要大家去研究,在这里博主抛出几个问题(当然博主自己已经实现了):

问题1如何在登录的时候加入验证码校验;

问题2如何在thymleaf使用shiro标签,比如:shiro:hasPermission

问题3:如何限制密码输错3次就不能登录了;

问题4:如何编写无状态的过滤器;

问题5:在同一个工程中如何有状态和无状态的过滤器同时并存;

posted on 2018-12-26 10:16  晒太阳的喵  阅读(166)  评论(0编辑  收藏  举报