一、简介
权限框架,相比Spring Security更加老牌,学完更容易上手其他权限框架。主要应用认证(Authentication),授权(Authorization),加密(Cryptography)和Session Manager,Web集成( Web Integration )。不依赖容器。
二、架构原理
Realms访问数据库,可以通过ini配置文件进行认证授权,也可以通过自定义Realm方式访问数据库进行对用户认证授权。
三、ini配置文件格式和内容
权限信息可以存储在ini文件中 key-value格式
- [main]主体部分:
[main]
securitiManager属性=值
key=value
securityManager.对象属性=com.kanlina.pojo.People #后面值是字符串
peo=com.kanlina.pojo.People
securityManeger.对象属性=$peo #出现$时才表示是引用对象
- [users]主体部分:
[users]
用户名=密码,角色1,角色2 #角色部分可以省略
zhangsan=zs
zhangsan=zs,role1,role2
- [roles]主体部分:
[roles]
角色名=权限名,权限名
role1=user:insert,user:update
role2=insert,update
role3=user:*
- [urls]主体部分:
[urls]
控制器名称=过滤器名称
/login=authc
/**=anon
Filter Name | Class |
---|---|
anon | org.apache.shiro.web.filter.authic.AnonymousFilter |
authc | org.apache.shiro.web.filter.authic.FormAuthenticationFilter |
authcBasic | org.apache.shiro.web.filter.authic.BasicHttpAuthenticationFilter |
logout | org.apache.shiro.web.filter.authic.LogoutFilter |
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter |
port | org.apache.shiro.web.filter.authz.PortFilter |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter |
ssl | org.apache.shiro.web.filter.authz.SslFilter |
user | org.apache.shiro.web.filter.authz.UserFilter |
(1)anon:不认证也可以访问。例如:/admin/**=anon
(2)authic:必须认证
(3)authcBasic:没有参数时表示httpBasic认证(客户端认证方式)。
(4)logout:退出。
(5)noSessionCreation:新增Filter,表示没有Session创建。
(6)perms:判断是否具有指定权限。例如:/admin/user/**=perms[“per1”,“per2”].必须同时具 有给定权限才可以访问。如果只有一个权限可以省略双引号。
(7)port:限制端口,例如:/admin/**=port[8081]。只要求不是8081端口就重新发送URL到8081端口。
(8)rest:请求方式和权限的简便写法。例如:/admin/**=rest[user],相当于/admin/**=perms[user:方式],方式是http请求的方式:post、get等。
(9)roles:判断是否具有指定权限。/admin/**=roles[role1]
(10)ssl:表示是安全的请求,协议为https。
(11)user:表示必须存在用户。
四、认证流程
获取主体,通过主体Subject对象的login方法进行登陆,把Subject中内容传递给Security Manager。Security Manager内部组件Authenticator进行认证,认证数据使用InI Realm,调用Ini文件中数据。
(1) Principal:身份。用户名,邮箱,手机等能够唯一确认身份的信息。
(2) Credential:凭证,代表密码等。
(3) AuthenticationInfo:认证时存储认证信息。
代码实现
(1)增加pom文件
(2)新建配置文件
(3)新建测试类(未集成)
1、获取SecurityManager的工厂对象
2、生产SecurityManager对象
3、将生产的SecurityManager存储到Utils中,保证SecurityManager在一次请求的任意位置获取的是同一个SecurityManager对象,不同请求获取不同的。
4、获取subject对象完成认证
5、创建认证信息对象,存储认证数据
6、完成认证操作
根据报错来判断是否验证成功
五、授权流程
用户认证成功后验证可以访问的路径
1. 代码实现(使用ini配置文件方式)
(1)判断角色,修改配置文件
[users]
zhangshan=zs,role1,role2
lisi=ls
(2) 添加代码,认证成功后授权
(3) 给角色增加权限
[users]
zhangshan=zs,role1,role2
lisi=ls
[roles]
role1=permission1,permission2
代码链接:https://gitee.com/anilnak/shiro-framework/tree/dev-1.0.0/
(4) 加密及凭证匹配器,对用户相关信息进行加密存储
代码链接:https://gitee.com/anilnak/shiro-framework/tree/dev-1.0.1/
2. 代码实现(通过自定义Realm类访问数据库)
(1)逻辑:
//实现数据与数据库中进行匹配
//继承AuthenticatingRealm
//1、获取要认证的身份
//2、验证身份
//3、身份验证后验证凭证
//4、验证密码
//5验证失败返回null,成功返回该对象
//修改ini文件,添加[mian]
[main]
myRealm=com.kanlina.MyRealm
securityManager.realms=$myRealm
[users]
zhangsan=zs,role1,role2
lisi=ls
[roles]
role1=permission1,permission2
代码链接:https://gitee.com/anilnak/shiro-framework/tree/dev-1.0.2
(2)凭证匹配器,用户真实密码与数据库中进行匹配,修改ini文件,告诉shiro使用md5加密
[main]
md5CredentialsMatcher=org.apache.shiro.authc.credential.Md5CredentialsMatcher
md5CredentialsMatcher.hashIterations=2
myRealm=com.kanlina.MyRealm
myRealm.credentialsMatcher=$md5CredentialsMatcher
securityManager.realms=$myRealm