注意:首页的访问路径的过滤器 不能是 authc,只能是 user 或 anon
<!-- 首页 xx.jsp --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <html> <body> <h2>Hello World! </h2> <!-- 重点在此:通过如下shiro标签显示 --> <shiro:user> 欢迎您,<shiro:principal/> <a href="#">退出登录</a> </shiro:user> </body> </html> <!-- 登录页面 login.jsp 自动填充用户名 --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <html> <head> <title>Title</title> </head> <body> <form action="<c:url value="/user/login"/>" method="post"> <!-- 重点在此:<shiro:principal/> --> username:<input type="text" value="<shiro:principal/>"> <br> password:<input type="password"><br> <input type="submit" value="登录"> </form> </body> </html> 7.4 自定义如果需要做自定义,可以明确定义如下两个组件:
SimpleCookie:封装cookie的相关属性,定制cookie写出逻辑(详见:addCookieHeader())
CookieRememberMeManager:接受SecurityManager调度,获取用户信息,加密数据,并调度SimpleCookie写出cookie。
<!-- 之前的配置不变,添加如下配置 --> <!-- remember me --> <bean> <!-- rememberMe是cookie值中的key,value时用户名的密文 cookie["rememberMe":"deleteMe"] 此cookie每次登陆后都会写出,用于清除之前的cookie cookie["rememberMe":username的密文] 此cookie也会在登录后写出,用于记录最新的username (ops: 如上设计,既能保证每次登陆后重新记录cookie,也能保证切换账号时,记录最新账号) --> <property value="rememberMe"/> <!-- cookie只在http请求中可用,那么通过js脚本将无法读取到cookie信息,有效防止cookie被窃取 --> <property value="true"/> <!-- cookie的生命周期,单位:秒 --> <property value="2592000"/><!-- 30天 --> </bean> <bean> <!-- 注入SimpleCookie --> <property ref="rememberMeCookie"/> </bean> <bean> ... <!-- CookieRememberMeManager注入给SecurityManager, SecurityManager在处理login时,如果login成功,则会通过rememberMeManager做"记住我", 将用户名存入cookie --> <property ref="rememberMeManager"/> </bean> 八、shiro标签shiro提供了很多标签,用于在jsp中做安全校验。
完成对页面元素的访问控制
8.1 导入shiro标签库 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%> <html> .... </html> 8.2 身份认证**<shiro:authenticated> <shiro:user> <shiro:guest> ** **已登录 已登录或记住我 游客(未登录 且 未记住我) **
**<shiro:notAuthenticated> <shiro:principal> ** 未登录 获取用户身份信息
<shiro:authenticated> 欢迎您,<shiro:principal/> </shiro:authenticated> <shiro:user> <!-- 常用,包含已登录 且配合记住我,用户体验好 --> 欢迎您,<shiro:principal/> </shiro:user> <shiro:guest> 欢迎您,未登录,请<a href="<c:url value="/user/login/page"/>">登录</a> </shiro:guest> <shiro:notAuthenticated> 您尚未登录(记住我也算在未登录中) </shiro:notAuthenticated> 8.3 角色校验<shiro:hasAnyRoles> <shiro:hasRole> 是其中任何一种角色 是指定角色
<shiro:lacksRole> 不是指定角色
<table> <tr> <td>id</td> <td>name</td> <td>operation</td> </tr> <tr> <td>001</td> <td>张三</td> <td> <shiro:hasAnyRoles> <a href="#">详情</a> </shiro:hasAnyRoles> <shiro:hasRole> <a href="#">删除</a> </shiro:hasRole> <shiro:lacksRole> <a href="#">点击升级</a> </shiro:lacksRole> </td> </tr> </table> 8.4 权限校验<shiro:hasPermission> 有指定权限
<shiro:lacksPermission> 缺失指定权限
... <td> <a href="#">查看详情</a> <shiro:hasPermission> <a href="#">删除</a> </shiro:hasPermission> <shiro:lacksPermission> <a href="#" >无权删除</a> </shiro:lacksPermission> </td> ... 8.5 自定义标签(了解)