shiro
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。
我们先了解下Realm
一、 一个简单的shiro
1、添加依赖
2、创建文件
创建一个File文件,名字随意,但是扩展名一定要是ini
然后我们用文本编辑器Text Editor打开。
在我们创建的ini文件中可以写4种权限用户,users、main、 roles、urls
[main] 提供了对根对象 securityManager 及其依赖的配置
[users] 提供了对用户/密码及其角色的配置
[roles] 提供了角色及权限之间关系的配置
[urls] 用于 web,提供了对 web url 拦截相关的配置
3、测试
二、自定义Realm
1、继承AuthorizingRealm
我们自定义Realm的话,需要继承AuthorizingRealm这个接口,而我们上面使用的默认Realm也是通过继承这个方法来实现的。
这里的两个方法中,形参是AuthenticationToken的是认证的方法,而另外一个则是授权的方法。这里我们使用认证的方法。
2、实现认证方法
后面的myrealm是自定义的名称,也可以是别的。他主要是在多个Realm的情况下用以识别。
3、ini文件
ini文件中需要配置main
然后我们就可以用上面的测试代码测试了。
三、加密
这里以MD5加密为例
四、授权
1、先在ini文件中配置用户、角色、权限
2、登录成功后进行角色校验
3、授权
4、注解和标签实现权限
因为注解的方式实现是利用AOP的方式,所以需要导入AOP的包
然后需要在springmvc中开启Shiro注解
然后配置ref要和配置的id一致
如果被权限拦截后出现异常,则我们需要一个处理方式
这里表示如果出现权限异常,就跳转到refuse.jsp这个页面。
需要多个权限的话就使用value 和 logical
logical有OR和AND两个属性。
OR—访问的角色只需要role1或者role3权限中的一个
AND—访问的角色需要role1和role3权限同时有
五、缓存
他的作用主要是将授权时所进行的不用的数据进行存贮和清除。
1、配置缓存
配置了以后运行,我们的授权就只会读取一次,解决了授权的问题。
但是如果用户在登录后将权限修改了,这时候缓存却不能及时的更新,所以我们需要清理一下以前的缓存。
2、清空缓存
然后设置注入再使用
六、Remember Me
remember me的主要作用就是记住本次登录。如果在近一段时间登录过这个网页,那么下次再访问这个网页则不需要输入账号密码,他就已经登录了。
1、在登录表单中加入记住密码选项
2、配置Remember Me
<!-- remenberMe配置 -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="rememberMe" />
<property name="httpOnly" value="true" />
<!-- 默认记住7天(单位:秒) -->
<property name="maxAge" value="604800" />
</bean>
<!-- rememberMe管理器 -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cipherKey"
value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}" />
<property name="cookie" ref="rememberMeCookie" />
</bean>
然后关联配置
这样我们下次访问时就能够直接访问而不需要登录,因为你的账号密码已经记录在coke中了,下次他会直接从coke中读取。