Shiro
ShiroFilter的工作原理
DelegatingFilterProxy 作用是自动到 Spring 容器查找字为 shiroFilter(filter-name)的 bean 并把所有 Filter 的操作委托给它。所以web.xml和spring 容器中的filter-name应该一样。
URL匹配模式
Ant 路径通配符支持 ?、*、**,注意通配符匹配不 包括目录分隔符“/”:
– ?:匹配一个字符,如 /admin? 将匹配 /admin1,但不 匹配 /admin 或 /admin/;
– *:匹配零个或多个字符串,如 /admin*
将匹配/admin、 /admin123,但不匹配 /admin/1;
–** :匹配路径中的零个或多个路径,如 /admin/** 将匹 配 /admin/a 或 /admin/a/b
URL匹配顺序
URL 权限采取第一次匹配优先的方式,即从头开始 使用第一个匹配的 url 模式对应的拦截器链。
身份认证思路
- 获取当前的subject,调用SecurityUtils.getSubject();
- 测试当前的用户是否已经被认证,即是否已经登录,调用subject的isAuthenticated()
- 若没有被认证,则把用户名和密码封装为UsernamePasswordToken对象
- 创建一个表单页面
- 把请求提交到Springmvc的Handler
- 获取用户名和密码
- 执行登录:调用subject的login(AuthenticationToken)方法。
- 自定义Realm的方法,从数据库中获取对应的记录,返回给shiro。
- 实际上需要继承org.apach.shiro.realm.AuthenticatingRealm类
- 实现doGetAuthenticationInfo(AuthenticationToken)方法。
- 由shiro完成对密码的比对。
密码的比对:
通过AuthenticatingRealm的credentialsMatcher属性来进行的密码比对。
- 如何把一个字符串加密为MD5
替换当前的Realm的credentialsMatcher属性,直接使用HashedCredentialsMatcher对象,并设置加密算法即可。
实现认证Realm步骤
实现授权
-
授权需要继承AuthorizingRealm类,并实现其doGetAuthorizationInfo方法。
-
AuthorizingRealm类继承自AuthenticatingRealm,但没有实现AuthenticatingRealm中的doGetAuthenticationInfo,所以认证和授权只需要继承
AuthorizingRealm就可以了,同时实现两个抽象方法