Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。
What
Shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。
spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。
shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。
Why
- 用户认证就是登陆操作、用户授权就是对资源的操作。
- 以前URL拦截的时候,需要把所有的URL都在数据库进行配置管理。非常麻烦,不易维护。
- Shiro通过realm去数据库查询数据来认证,而非查询配置文件的数据的。自定义reaml要继承AuthorizingRealm类就行了。
- 散列算法就是为了让密码不被别人给破解。我们可对原始的密码加盐再进行散列,这就加大了破解的难度了。
How
- 构造SecurityManager环境
- Subject.login()提交认证
- SecurityManager.login()执行认证
- Authenticator执行认证
- Realm根据身份获取验证信息
认证实现流程:
1. 获取当前的 Subject. 调用 SecurityUtils.getSubject();
2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAuthenticated()
3. 若没有被认证, 则把用户名和密码封装为 UsernamePasswordToken 对象
1). 创建一个表单页面
2). 把请求提交到 SpringMVC 的 Handler
3). 获取用户名和密码.
4. 执行登录: 调用 Subject 的 login(AuthenticationToken) 方法.
5. 自定义 Realm 的方法, 从数据库中获取对应的记录, 返回给 Shiro.
1). 实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类
2). 实现 doGetAuthenticationInfo(AuthenticationToken) 方法.
6. 由 shiro 完成对密码的比对.
通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!
密码的比对:
通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!
替换当前 Realm 的 credentialsMatcher 属性. 直接使用 HashedCredentialsMatcher 对象, 并设置加密算法即可.
配置application-shiro.xml
<bean id="jdbcRealm" class="com.zhongyou.shiro.realms.ShiroRealm">
<property name="credentialsMatcher">
<bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="MD5"></property>
<property name="hashIterations" value="1024"></property>
</bean>
</property>
</bean>
三个核心组件:Subject, SecurityManager 和 Realms.
- Subject:即“当前操作用户”。主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Su