—— 代码存在问题,作为理解Shiro 运行流程教程

Shiro 使用

Shiro的jar包 :(Shiro已不推荐这样使用)

  1. <dependency>
  2. <groupId>org.apache.shiro</groupId>
  3. <artifactId>shiro-core</artifactId>
  4. <version>1.2.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.shiro</groupId>
  8. <artifactId>shiro-web</artifactId>
  9. <version>1.2.3</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.shiro</groupId>
  13. <artifactId>shiro-spring</artifactId>
  14. <version>1.2.3</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.apache.shiro</groupId>
  18. <artifactId>shiro-ehcache</artifactId>
  19. <version>1.2.3</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.shiro</groupId>
  23. <artifactId>shiro-quartz</artifactId>
  24. <version>1.2.3</version>
  25. </dependency>

也可以通过引入shiro-all包括shiro所有的包:

  1. <dependency>
  2. <groupId>org.apache.shiro</groupId>
  3. <artifactId>shiro-all</artifactId>
  4. <version>1.2.3</version>
  5. </dependency>

Shiro认证

认证流程图

Shiro 基本使用 [有问题] - 图1

入门程序:
1、创建普通的java 工程项目
2、导入jar 包
3、使用log4j.properties日志配置文件输出日志

  1. log4j.rootLogger=debug, stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

4、使用shiro.ini 文件 【通过Shiro.ini配置文件初始化SecurityManager环境】
配置 eclipse支持ini文件编辑:(IDEA 添加ini插件,创建ini文件即可)

Shiro 基本使用 [有问题] - 图2

在eclipse配置后,在classpath创建shiro.ini配置文件,为了方便测试将用户名和密码配置的shiro.ini配置文件中:

  1. [users]
  2. zhang=123
  3. lisi=123

认证代码:

  1. import org.apache.shiro.mgt.SecurityManager;
  2. // 用户登陆、用户退出
  3. @Test
  4. public void testLoginLogout() {
  5. // 注意:SecurityManager在java.lang包下也有同名的SecurityManager
  6. // 构建SecurityManager工厂,IniSecurityManagerFactory可以从ini文件中初始化SecurityManager环境
  7. Factory<SecurityManager> factory = new IniSecurityManagerFactory(
  8. "classpath:shiro.ini");
  9. // 通过工厂创建SecurityManager
  10. SecurityManager securityManager = factory.getInstance();
  11. // 将securityManager设置到运行环境中
  12. SecurityUtils.setSecurityManager(securityManager);
  13. // 创建一个Subject实例,该实例认证要使用上边创建的securityManager进行
  14. Subject subject = SecurityUtils.getSubject();
  15. // 创建token令牌,记录用户认证的身份和凭证即账号和密码
  16. UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
  17. try {
  18. // 用户登陆
  19. subject.login(token);
  20. } catch (AuthenticationException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. }
  24. // 用户认证状态
  25. Boolean isAuthenticated = subject.isAuthenticated();
  26. System.out.println("用户认证状态:" + isAuthenticated);
  27. // 用户退出
  28. subject.logout();
  29. isAuthenticated = subject.isAuthenticated();
  30. System.out.println("用户认证状态:" + isAuthenticated);
  31. }

认证执行流程

1、 创建token令牌,token中有用户提交的认证信息即账号和密码
2、 执行subject.login(token),最终由securityManager通过Authenticator进行认证
3、 Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)
4、 IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。

以上程序使用的是Shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm

shiro提供的realm 如下图:

Shiro 基本使用 [有问题] - 图3

最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权,通常自定义的realm继承AuthorizingRealm

自定义Realm

  1. public class CustomRealm1 extends AuthorizingRealm {
  2. @Override
  3. public String getName() {
  4. return "customRealm1";
  5. }
  6. //支持UsernamePasswordToken
  7. @Override
  8. public boolean supports(AuthenticationToken token) {
  9. return token instanceof UsernamePasswordToken;
  10. }
  11. //认证
  12. @Override
  13. protected AuthenticationInfo doGetAuthenticationInfo(
  14. AuthenticationToken token) throws AuthenticationException {
  15. //从token中 获取用户身份信息
  16. String username = (String) token.getPrincipal();
  17. //拿username从数据库中查询
  18. //....
  19. //如果查询不到则返回null
  20. if(!username.equals("zhang")){//这里模拟查询不到
  21. return null;
  22. }
  23. //获取从数据库查询出来的用户密码
  24. String password = "123";//这里使用静态数据模拟。。
  25. //返回认证信息由父类AuthenticatingRealm进行认证
  26. SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
  27. username, password, getName());
  28. return simpleAuthenticationInfo;
  29. }
  30. //授权
  31. @Override
  32. protected AuthorizationInfo doGetAuthorizationInfo(
  33. PrincipalCollection principals) {
  34. // TODO Auto-generated method stub
  35. return null;
  36. }
  37. }

同时需要创建shiro-realm.ini 文件:

  1. [main]
  2. #自定义 realm
  3. customRealm=cn.itcast.shiro.authentication.realm.CustomRealm1
  4. #将realm设置到securityManager
  5. securityManager.realms=$customRealm

测试代码同入门程序,将ini的地址修改为shiro-realm.ini
一般来说密码需要 加密 可以选择MD5加密方式这里就不详细说明。

Shiro授权

授权流程图

Shiro 基本使用 [有问题] - 图4

授权方式

  1. Shiro 支持三种方式的授权:
  2. 1. 编程式:通过写if/else 授权代码块完成:
  3. Subject subject = SecurityUtils.getSubject();
  4. if(subject.hasRole(“admin”)) {
  5. //有权限
  6. } else {
  7. //无权限
  8. }
  9. 2. 注解式:通过在执行的Java方法上放置相应的注解完成:
  10. @RequiresRoles("admin")
  11. public void hello() {
  12. //有权限
  13. }
  14. 3. JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
  15. <shiro:hasRole name="admin">
  16. <!— 有权限—>
  17. </shiro:hasRole>

授权测试 :

1、创建存放权限的配置文件shiro-permission.ini,如下:

  1. [users]
  2. #用户zhang的密码是123,此用户具有role1role2两个角色
  3. zhang=123,role1,role2
  4. wang=123,role2
  5. [roles]
  6. #角色role1对资源user拥有createupdate权限
  7. role1=user:create,user:update
  8. #角色role2对资源user拥有createdelete权限
  9. role2=user:create,user:delete
  10. #角色role3对资源user拥有create权限
  11. role3=user:create

注意:在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2…” “角色=权限1,权限2…”,首先根据用户名找角色,再根据角色找权限,角色是权限集合

权限字符串规则

  1. 权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
  2. 例子:
  3. 用户创建权限:user:create,或user:create:*
  4. 用户修改实例001的权限:user:update:001
  5. 用户实例001的所有权限:user:*:001

测试代码如下:

  1. @Test
  2. public void testPermission() {
  3. // 从ini文件中创建SecurityManager工厂
  4. Factory<SecurityManager> factory = new IniSecurityManagerFactory(
  5. "classpath:shiro-permission.ini");
  6. // 创建SecurityManager
  7. SecurityManager securityManager = factory.getInstance();
  8. // 将securityManager设置到运行环境
  9. SecurityUtils.setSecurityManager(securityManager);
  10. // 创建主体对象
  11. Subject subject = SecurityUtils.getSubject();
  12. // 对主体对象进行认证
  13. // 用户登陆
  14. // 设置用户认证的身份(principals)和凭证(credentials)
  15. UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
  16. try {
  17. subject.login(token);
  18. } catch (AuthenticationException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. }
  22. // 用户认证状态
  23. Boolean isAuthenticated = subject.isAuthenticated();
  24. System.out.println("用户认证状态:" + isAuthenticated);
  25. // 用户授权检测 基于角色授权
  26. // 是否有某一个角色
  27. System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
  28. // 是否有多个角色
  29. System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));
  30. // subject.checkRole("role1");
  31. // subject.checkRoles(Arrays.asList("role1", "role2"));
  32. // 授权检测,失败则抛出异常
  33. // subject.checkRole("role22");
  34. // 基于资源授权
  35. System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
  36. System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1", "user:delete"));
  37. //检查权限
  38. subject.checkPermission("sys:user:delete");
  39. subject.checkPermissions("user:create:1","user:delete");
  40. }

注意:测试代码同认证代码,注意ini地址改为shiro-permission.ini,主要学习下边授权的方法;在用户认证通过后执行下边的授权代码

基于角色的授权

  1. // 用户授权检测 基于角色授权
  2. // 是否有某一个角色
  3. System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));
  4. // 是否有多个角色
  5. System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));

//对应的check方法:
subject.checkRole(“role1”);
subject.checkRoles(Arrays.asList(“role1”, “role2”));

上边check方法如果授权失败则抛出异常:
org.apache.shiro.authz.UnauthorizedException: Subject does not have role […..]

基于资源授权

  1. // 基于资源授权
  2. System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));
  3. System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1", "user:delete"));
  4. 对应的check方法:
  5. subject.checkPermission("sys:user:delete");
  6. subject.checkPermissions("user:create:1","user:delete");

与上边认证自定义realm一样,大部分情况是要从数据库获取权限数据,这里直接实现基于资源的授权

授权自定义 realm 代码 如下:
直接在认证写的自定义realm类中完善doGetAuthorizationInfo方法,此方法需要完成:根据用户身份信息从数据库查询权限字符串,由shiro进行授权:

  1. // 授权
  2. @Override
  3. protected AuthorizationInfo doGetAuthorizationInfo(
  4. PrincipalCollection principals) {
  5. // 获取身份信息
  6. String username = (String) principals.getPrimaryPrincipal();
  7. // 根据身份信息从数据库中查询权限数据
  8. //....这里使用静态数据模拟
  9. List<String> permissions = new ArrayList<String>();
  10. permissions.add("user:create");
  11. permissions.add("user.delete");
  12. //将权限信息封闭为AuthorizationInfo
  13. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
  14. for(String permission:permissions){
  15. simpleAuthorizationInfo.addStringPermission(permission);
  16. }
  17. return simpleAuthorizationInfo;
  18. }

授权执行流程

1、 执行subject.isPermitted(“user:create”)
2、 securityManager通过ModularRealmAuthorizer进行授权
3、 ModularRealmAuthorizer调用realm获取权限信息
4、 ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配

Shiro与spring web项目的整合

1、web.xml添加shiro Filter

  1. <!-- shiro过虑器,DelegatingFilterProx会从spring容器中找shiroFilter -->
  2. <filter>
  3. <filter-name>shiroFilter</filter-name>
  4. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  5. <init-param>
  6. <param-name>targetFilterLifecycle</param-name>
  7. <param-value>true</param-value>
  8. </init-param>
  9. </filter>
  10. <filter-mapping>
  11. <filter-name>shiroFilter</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>

2、applicationContext-shiro.xml

  1. <!-- Shiro 的Web过滤器 -->
  2. <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  3. <property name="securityManager" ref="securityManager" />
  4. <!-- 如果没有认证将要跳转的登陆地址,http可访问的url,如果不在表单认证过虑器FormAuthenticationFilter中指定此地址就为身份认证地址 -->
  5. <property name="loginUrl" value="/login.action" />
  6. <!-- 没有权限跳转的地址 -->
  7. <property name="unauthorizedUrl" value="/refuse.jsp" />
  8. <!-- shiro拦截器配置 -->
  9. <property name="filters">
  10. <map>
  11. <entry key="authc" value-ref="formAuthenticationFilter" />
  12. </map>
  13. </property>
  14. <property name="filterChainDefinitions">
  15. <value>
  16. <!-- 必须通过身份认证方可访问,身份认 证的url必须和过虑器中指定的loginUrl一致 -->
  17. /loginsubmit.action = authc
  18. <!-- 退出拦截,请求logout.action执行退出操作 -->
  19. /logout.action = logout
  20. <!-- 无权访问页面 -->
  21. /refuse.jsp = anon
  22. <!-- roles[XX]表示有XX角色才可访问 -->
  23. /item/list.action = roles[item],authc
  24. /js/** anon
  25. /images/** anon
  26. /styles/** anon
  27. <!-- user表示身份认证通过或通过记住我认证通过的可以访问 -->
  28. /** = user
  29. <!-- /**放在最下边,如果一个url有多个过虑器则多个过虑器中间用逗号分隔,如:/** = user,roles[admin] -->
  30. </value>
  31. </property>
  32. </bean>
  33. <!-- 安全管理器 -->
  34. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  35. <property name="realm" ref="userRealm" />
  36. </bean>
  37. <!-- 自定义 realm -->
  38. <bean id="userRealm" class="cn.itcast.ssm.realm.CustomRealm1">
  39. </bean>
  40. <!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->
  41. <bean id="formAuthenticationFilter"
  42. class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
  43. <!-- 表单中账号的input名称 -->
  44. <property name="usernameParam" value="usercode" />
  45. <!-- 表单中密码的input名称 -->
  46. <property name="passwordParam" value="password" />
  47. <!-- <property name="rememberMeParam" value="rememberMe"/> -->
  48. <!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->
  49. <property name="loginUrl" value="/loginsubmit.action" />
  50. </bean>

注意:

  1. securityManager:这个属性是必须的。
  2. loginUrl:没有登录认证的用户请求将跳转到此地址,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。
  3. unauthorizedUrl:没有权限默认跳转的页面。

3、使用shiro注解授权

在springmvc.xml中配置shiro注解支持,可在controller方法中使用shiro注解配置权限:

  1. <!-- 开启aop,对类代理 -->
  2. <aop:config proxy-target-class="true"></aop:config>
  3. <!-- 开启shiro注解支持 -->
  4. <bean
  5. class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
  6. <property name="securityManager" ref="securityManager" />
  7. </bean>

修改Controller代码,在方法上添加授权注解,如下:

  1. // 查询商品列表
  2. @RequestMapping("/queryItem")
  3. @RequiresPermissions("item:query")
  4. public ModelAndView queryItem() throws Exception { 。。。。。。。 }

上边代码@RequiresPermissions(“item:query”)表示必须拥有“item:query”权限方可执行

4、重新自定义realm

  1. realm先不从数据库查询权限数据,当前需要先将shiro整合完成,在上定义的realm基础上修改:
  1. public class CustomRealm1 extends AuthorizingRealm {
  2. @Autowired
  3. private SysService sysService;
  4. @Override
  5. public String getName() {
  6. return "customRealm";
  7. }
  8. // 支持什么类型的token
  9. @Override
  10. public boolean supports(AuthenticationToken token) {
  11. return token instanceof UsernamePasswordToken;
  12. }
  13. // 认证
  14. @Override
  15. protected AuthenticationInfo doGetAuthenticationInfo(
  16. AuthenticationToken token) throws AuthenticationException {
  17. // 从token中 获取用户身份信息
  18. String username = (String) token.getPrincipal();
  19. // 拿username从数据库中查询
  20. // ....
  21. // 如果查询不到则返回null
  22. if (!username.equals("zhang")) {// 这里模拟查询不到
  23. return null;
  24. }
  25. // 获取从数据库查询出来的用户密码
  26. String password = "123";// 这里使用静态数据模拟。。
  27. // 根据用户id从数据库取出菜单
  28. //...先用静态数据
  29. List<SysPermission> menus = new ArrayList<SysPermission>();;
  30. SysPermission sysPermission_1 = new SysPermission();
  31. sysPermission_1.setName("商品管理");
  32. sysPermission_1.setUrl("/item/queryItem.action");
  33. SysPermission sysPermission_2 = new SysPermission();
  34. sysPermission_2.setName("用户管理");
  35. sysPermission_2.setUrl("/user/query.action");
  36. menus.add(sysPermission_1);
  37. menus.add(sysPermission_2);
  38. // 构建用户身体份信息
  39. ActiveUser activeUser = new ActiveUser();
  40. activeUser.setUserid(username);
  41. activeUser.setUsername(username);
  42. activeUser.setUsercode(username);
  43. activeUser.setMenus(menus);
  44. // 返回认证信息由父类AuthenticatingRealm进行认证
  45. SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(
  46. activeUser, password, getName());
  47. return simpleAuthenticationInfo;
  48. }
  49. // 授权
  50. @Override
  51. protected AuthorizationInfo doGetAuthorizationInfo(
  52. PrincipalCollection principals) {
  53. // 获取身份信息
  54. ActiveUser activeUser = (ActiveUser) principals.getPrimaryPrincipal();
  55. //用户id
  56. String userid = activeUser.getUserid();
  57. // 根据用户id从数据库中查询权限数据
  58. // ....这里使用静态数据模拟
  59. List<String> permissions = new ArrayList<String>();
  60. permissions.add("item:query");
  61. permissions.add("item:update");
  62. // 将权限信息封闭为AuthorizationInfo
  63. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
  64. for (String permission : permissions) {
  65. simpleAuthorizationInfo.addStringPermission(permission);
  66. }
  67. return simpleAuthorizationInfo;
  68. }
  69. }

5、登录controller

  1. //用户登陆页面
  2. @RequestMapping("/login")
  3. public String login()throws Exception{
  4. return "login";
  5. }
  6. // 用户登陆提交
  7. @RequestMapping("/loginsubmit")
  8. public String loginsubmit(Model model, HttpServletRequest request)
  9. throws Exception {
  10. // shiro在认证过程中出现错误后将异常类路径通过request返回
  11. String exceptionClassName = (String) request
  12. .getAttribute("shiroLoginFailure");
  13. if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
  14. throw new CustomException("账号不存在");
  15. } else if (IncorrectCredentialsException.class.getName().equals(
  16. exceptionClassName)) {
  17. throw new CustomException("用户名/密码错误");
  18. } else{
  19. throw new Exception();//最终在异常处理器生成未知错误
  20. }
  21. }

6、退出

由于使用shiro的sessionManager,不用开发退出功能,使用shiro的logout拦截器即可

  1. <!-- 退出拦截,请求logout.action执行退出操作 -->
  2. /logout.action = logout

注意:如需添加MD5校验需要修改applicationContext-shiro.xml:

  1. <!-- 凭证匹配器 -->
  2. <bean id="credentialsMatcher"
  3. class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
  4. <property name="hashAlgorithmName" value="md5" />
  5. <property name="hashIterations" value="1" />
  6. </bean>
  7. <!-- 自定义 realm -->
  8. <bean id="userRealm" class="cn.itcast.ssm.realm.CustomRealm1">
  9. <property name="credentialsMatcher" ref="credentialsMatcher" />
  10. </bean>

7、表设计 (自己查的)

image.png
image.png

Shiro缓存配置

在applicationContext-shiro.xml中配置缓存管理器:

  1. <!-- 安全管理器 -->
  2. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  3. <property name="realm" ref="userRealm" />
  4. <property name="sessionManager" ref="sessionManager" />
  5. <property name="cacheManager" ref="cacheManager"/>
  6. </bean>
  7. <!-- 缓存管理器 -->
  8. <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
  9. </bean>

Session管理

在applicationContext-shiro.xml中配置sessionManager

  1. <!-- 安全管理器 -->
  2. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  3. <property name="realm" ref="userRealm" />
  4. <property name="sessionManager" ref="sessionManager" />
  5. </bean>
  6. <!-- 会话管理器 -->
  7. <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  8. <!-- session的失效时长,单位毫秒 -->
  9. <property name="globalSessionTimeout" value="600000"/>
  10. <!-- 删除失效的session -->
  11. <property name="deleteInvalidSessions" value="true"/>
  12. </bean>

配置记住我(下次免登陆)

1、用户身份实现java.io.Serializable接口【即用户实体类】

2、修改applicationContext-shiro.xml中对FormAuthenticationFilter的配置:

  1. <bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"> 改为 如下:
  1. <bean id=*"formAuthenticationFilter"*
  2. class=*"cn.itcast.ssm.shiro.MyFormAuthenticationFilter"*>
  3. <!-- 表单中账号的input名称 -->
  4. <property name=*"usernameParam"* value=*"usercode"* />
  5. <!-- 表单中密码的input名称 -->
  6. <property name=*"passwordParam"* value=*"password"* />
  7. <property name=*"rememberMeParam"* value=*"rememberMe"*/>
  8. <!-- loginurl:用户登陆地址,此地址是可以http访问的url地址 -->
  9. <property name=*"loginUrl"* value=*"/loginsubmit.action"* />
  10. </bean>

3、修改applicationContext-shiro.xml

  1. <!-- 安全管理器 -->
  2. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  3. <property name="realm" ref="userRealm" />
  4. <property name="sessionManager" ref="sessionManager" />
  5. <property name="cacheManager" ref="cacheManager"/>
  6. <!-- 记住我 -->
  7. <property name="rememberMeManager" ref="rememberMeManager"/>
  8. </bean>
  9. <!-- rememberMeManager管理器 -->
  10. <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
  11. <property name="cookie" ref="rememberMeCookie" />
  12. </bean>
  13. <!-- 记住我cookie -->
  14. <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
  15. <constructor-arg value="rememberMe" />
  16. <!-- 记住我cookie生效时间30天 -->
  17. <property name="maxAge" value="2592000" />
  18. </bean>

登录页面 添加如下:

  1. <input type="checkbox" name="rememberMe" /> 自动登陆

附录

  1. shiro过虑器
  2. 过滤器简称 对应的java
  3. anon org.apache.shiro.web.filter.authc.AnonymousFilter
  4. authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter
  5. authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
  6. perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
  7. port org.apache.shiro.web.filter.authz.PortFilter
  8. rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
  9. roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
  10. ssl org.apache.shiro.web.filter.authz.SslFilter
  11. user org.apache.shiro.web.filter.authc.UserFilter
  12. logout org.apache.shiro.web.filter.authc.LogoutFilter
  13. anon:例子/admins/**=anon 没有参数,表示可以匿名使用。
  14. authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数
  15. roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。
  16. perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
  17. rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。
  18. port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString
  19. 是你访问的url里的?后面的参数。
  20. authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证
  21. ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https
  22. user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查
  23. 注:
  24. anon,authcBasic,auchc,user是认证过滤器,
  25. perms,roles,ssl,rest,port是授权过滤器
  26. shiro的jsp标签
  27. Jsp页面添加:
  28. <%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %>
  29. 标签名称 标签条件(均是显示标签内容)
  30. <shiro:authenticated> 登录之后
  31. <shiro:notAuthenticated> 不在登录状态时
  32. <shiro:guest> 用户在没有RememberMe时
  33. <shiro:user> 用户在RememberMe时
  34. <shiro:hasAnyRoles name="abc,123" > 在有abc或者123角色时
  35. <shiro:hasRole name="abc"> 拥有角色abc
  36. <shiro:lacksRole name="abc"> 没有角色abc
  37. <shiro:hasPermission name="abc"> 拥有权限资源abc
  38. <shiro:lacksPermission name="abc"> 没有abc权限资源
  39. <shiro:principal> 显示用户身份名称
  40. <shiro:principal property="username"/> 显示用户身份中的属性值