Shiro框架+练习代码

一、简介

权限框架,相比Spring Security更加老牌,学完更容易上手其他权限框架。主要应用认证(Authentication),授权(Authorization),加密(Cryptography)和Session Manager,Web集成( Web Integration )。不依赖容器。

二、架构原理

在这里插入图片描述
Realms访问数据库,可以通过ini配置文件进行认证授权,也可以通过自定义Realm方式访问数据库进行对用户认证授权。

三、ini配置文件格式和内容

权限信息可以存储在ini文件中 key-value格式

  1. [main]主体部分:
[main]
securitiManager属性=值
key=value
securityManager.对象属性=com.kanlina.pojo.People #后面值是字符串

peo=com.kanlina.pojo.People
securityManeger.对象属性=$peo #出现$时才表示是引用对象
  1. [users]主体部分:
[users]
用户名=密码,角色1,角色2 #角色部分可以省略
zhangsan=zs
zhangsan=zs,role1,role2
  1. [roles]主体部分:
[roles]
角色名=权限名,权限名
role1=user:insert,user:update
role2=insert,update
role3=user:*
  1. [urls]主体部分:
[urls]
控制器名称=过滤器名称
/login=authc
/**=anon
Filter NameClass
anonorg.apache.shiro.web.filter.authic.AnonymousFilter
authcorg.apache.shiro.web.filter.authic.FormAuthenticationFilter
authcBasicorg.apache.shiro.web.filter.authic.BasicHttpAuthenticationFilter
logoutorg.apache.shiro.web.filter.authic.LogoutFilter
noSessionCreationorg.apache.shiro.web.filter.session.NoSessionCreationFilter
permsorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
portorg.apache.shiro.web.filter.authz.PortFilter
restorg.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
rolesorg.apache.shiro.web.filter.authz.RolesAuthorizationFilter
sslorg.apache.shiro.web.filter.authz.SslFilter
userorg.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、完成认证操作
         根据报错来判断是否验证成功

五、授权流程

用户认证成功后验证可以访问的路径
[img 0D405231-893A-4D3E-BFC0-882E5C3AF74B]

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

代码链接:https://gitee.com/anilnak/shiro-framework/tree/master

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值