Spring 整合Shiro:记住我

1、登录方法

/**
     * 执行登录操作
     *
     * @param username
     * @param password
     * @param rememberMe
     * @param model
     * @return
     */
    @Log("登录")
    @RequestMapping("/login")
    String login(String username, String password, Boolean rememberMe, Model model) {
        //判断用户名和密码为空
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
            model.addAttribute("msg", "用户名和密码不能为空!");
            return "login.html";
        }

        // shiro登录步骤
        // 1、获取subject对象
        Subject subject = SecurityUtils.getSubject();

        // 2、封装对象
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        System.out.println(token.toString());

        // 3、执行登录(失败会报异常,需捕获异常)
        // 实际开发中,用户名和密码错误,不给出明确提示
        try {
            // 设置是否记住我
            rememberMe = rememberMe == null ? false : rememberMe;
            // 设置记住我
            token.setRememberMe(rememberMe);       // 登录
            subject.login(token);
            // 这样url会改变为index_v1,不然还会是login
            return "redirect:/index_v1";
        } catch (UnknownAccountException e) {//账号不存在
            model.addAttribute("msg", "用户名不存在!");
            return "/login";
        } catch (LockedAccountException e) {//账户锁定
            model.addAttribute("msg", "账户被锁定!");
            return "/login";
        } catch (IncorrectCredentialsException e) {//密码错误
            model.addAttribute("msg", "密码错误!");
            return "/login";
        }
    }

2、ShiroConfig

/**
 * Copyright (C), 2018-2018, 谪仙科技有限公司
 * FileName ShiroConfig
 * Author wangzhiguo
 * Date 2018-12-25 2:49
 * Description Shiro配置
 * History
 * <author>          <time>          <version>          <desc>
 * wangzhiguo        2018-12-25          版本号              描述
 */
package com.itgeek.config.shiro.config;

import com.itgeek.config.shiro.realm.Myrealm;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 〈功能描述〉
 * Shiro配置
 * <p>
 * <p>
 * 系统启动,执行顺序
 * realm -- > securityManager -- > filter
 *
 * @author wangzhiguo
 * @date 2018-12-25
 * @since 1.0.0
 */

@Configuration
public class ShiroConfig {
    /**
     * shiro核心filter
     *
     * @return
     */
    @Bean()
    public ShiroFilterFactoryBean getShiroFilterFactoryBean() {
        System.out.println("Shiro过滤器");
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 设置SecurityManager(必须)
        shiroFilterFactoryBean.setSecurityManager(securityManager());
        /**
         * shiro常用过滤器
         * anon:无需认证
         * authc:必须认证
         * user:如果使用rememberMe功能可以直接访问
         * perms:必须得到资源权限可以访问
         * role:必须得到角色权限可以访问
         */
        // LinkedHashMap 可以保持顺序
        Map<String, String> filterMap = new LinkedHashMap<>();

        // 1、认证
        filterMap.put("/", "anon");
        filterMap.put("/index", "anon");

        filterMap.put("/toLogin", "anon");
        filterMap.put("/login", "anon");

        // 2、资源权限
        filterMap.put("/sys/add", "perms[user:edit]");
        // 3、角色权限

        // 所有请求都要认证
        // filterMap.put("/**", "authc");
        // 认证或记住我都可以登录
        filterMap.put("/**", "user");
        // 未授权
        shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");
        // 设置跳转的登录页
        shiroFilterFactoryBean.setLoginUrl("/toLogin");
        // 设置登录成功的页面
        shiroFilterFactoryBean.setSuccessUrl("/index_v1");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        return shiroFilterFactoryBean;
    }

    /**
     * 安全管理器
     * 缓存注入在这
     *
     * @return
     */
    @Bean()
    public DefaultWebSecurityManager securityManager() {
        System.out.println("Shiro安全管理器");
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 设置realm
        securityManager.setRealm(myrealm());
        // session会话
        // securityManager.setSessionManager(sessionManager());
        // 设置记住我
        securityManager.setRememberMeManager(rememberMeManager());
        return securityManager;
    }

    /**
     * realm:自定义的认证和授权逻辑
     *
     * @return
     */
    @Bean()
    public Myrealm myrealm() {
        System.out.println("自定义Realm");
        return new Myrealm();
    }

    /**
     * 记住我
     *
     * @return
     */
    @Bean
    public CookieRememberMeManager rememberMeManager() {
        System.out.println("记住我:rememberMe");
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
        //这个地方有点坑,不是所有的base64编码都可以用,长度过大过小都不行,没搞明白,官网给出的要么0x开头十六进制,要么base64
        cookieRememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
        return cookieRememberMeManager;
    }

    /**
     * Cookie管理
     * 创建记住我cookie
     *
     * @return
     */
    @Bean
    public SimpleCookie rememberMeCookie() {
        System.out.println("rememberMeCookie");
        SimpleCookie cookie = new SimpleCookie("rememberMe");
        cookie.setHttpOnly(true);
        // 声明周期
        cookie.setMaxAge(1 * 60 * 60);
        return cookie;
    }
}

3、登录页面

<form action="/login" method="post">
        <span style="color: red" th:text="${msg}"></span>
        <br>
        姓名<input type="text" name="username"> <br>
        密码<input type="password" name="password"> <br>
        记住我<input type="checkbox" checked="checked" name="rememberMe"> <br>
        <button type="submit">登录</button>
    </form>

4、登录(记住我),会生成rememberMe CookIe

不记住我:rememberMe Cookie 不会生成

注销(SHiro:/logout)也会清除rememberMe Cookie

原文地址:https://www.cnblogs.com/it-noob/p/10176630.html

时间: 2024-10-19 22:31:42

Spring 整合Shiro:记住我的相关文章

Spring整合Shiro做权限控制模块详细案例分析

1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId

servlet3.0全注解spring整合shiro

基本说明 基于Servlet3.0全注解配置的Spring整合Shiro 目录 配置文件 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.ap

spring整合shiro框架

上一篇文章已经对shiro框架做了一定的介绍,这篇文章讲述使用spring整合shiro框架,实现用户认证已经权限控制 1.搭建环境 这里不在赘述spring环境的搭建,可以简单的搭建一个ssm框架,整合后进行简单的测试 1.1 添加依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3

【原】Spring整合Shiro基础搭建[3]

1.前言 上个Shiro Demo基础搭建是基于官方的快速入门版本,没有集成其他框架,只是简单的通过Main方法来执行Shiro工作流程,并测试一下比较核心的函数:但在企业开发中一般都会集成Spring,因为被Spring管理后很多事情都交给了Spring框架进行了管理,而且Spring框架提供了丰富的支持类,不仅方便我们开发人员进行扩展,也利于维护,通过Spring管理我们能把更多的细节放在业务上,提高我们的开发效率. 2.搭建过程       首先是 新建一个web工程,引入Spring和S

spring整合shiro配置BUG,Tomcat启动不了:Error during artifact deployment. See server log for details

现象 spring配置shiro权限控制之后,项目无法启动 [2019-08-09 09:00:35,800] Artifact export_web_manager:war exploded: Error during artifact deployment. See server log for details. Tomcat起不来 原因 将shiro的spring配置放在了springmvc配置中,项目启动报错. web.xml中的配置 <servlet> <servlet-nam

spring整合shiro

配置一个存储权限的缓存  ehcache-shiro.xml <ehcache updateCheck="false" name="shiroCache"> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" o

maven项目中Spring整合Shiro配置文件(示例)

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schem

学记:spring boot整合shiro出现UnavailableSecurityManagerException

spring boot自带spring security,spring security自然不用说是一个强大的安全框架,但是用惯了shiro,一时半会用不来spring security,所以要在spring boot中自己整合shiro.说到整合shiro,网上也是有不少教程的,但是网上的教程也不是一定是对的,可能有版本等各种问题,所以说还是要自己来动手做一遍. 在我动手整合的时候出现UnavailableSecurityManagerException的错误: 2016-12-24 10:5

spring整合springMVC、mybatis、shiro

jar包: 1 <properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <maven.compiler.source>1.7</maven.compiler.source> 4 <maven.compiler.target>1.7</maven.compiler.target> 5 <!--spring版本