admin 管理员组文章数量: 887085
2024年2月7日发(作者:duration的prep)
开源权限管理框架Shiro
针对Shiro使用的入门级介绍,目的是快速开始使用。阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
一、Shiro基本概念:
Apache Shiro(日语“堡垒(Castle)”的意思)是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障- 从命令行应用、移动应用到大型网络及企业应用。
Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API:认证- 用户身份识别,常被称为用户“登录”;
授权- 访问控制;
密码加密- 保护或隐藏数据防止被偷窥;
会话管理- 每用户相关的时间敏感的状态。
Shiro还支持一些辅助特性,如Web应用安全、单元测试和多线程,它们的存在强化了上面提到的四个要素。
Shiro的基本功能如图:
二、Shiro基本处理流程及一些主要概念
如图:
Shiro框架拦截到一个应用请求后,会为此请求建立一个Subject对象,本次Session没关闭时,Subject对象会一直存在,作为一个虚拟的user对象。对此对象可以进行身份验证(Authentication)和权限验证
(Authorization),这些处理将会提交给Shiro的SecurityManager 对象。简单地理解,SecurityManager是一个总调度,负责接受不同的Subject对象的权限相关的处理请求。而真正干活的是Realm对象,也就是说最后作身份验证和权限验证的是Realm
针对Shiro使用的入门级介绍,目的是快速开始使用。阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
对象。
Shiro的Realm对象不提供用户信息和权限信息,这些信息是Shiro的使用者要提供的,Realm中定义的各种验证方法和安全数据的容器,使用者是把自己的安全数据装进去。
重要的事情再说一遍,对subject的各种安全验证,使用者调用subject对象的相关属性和方法,不直接操作Realm对象。
三、一些简单的例子
为了帮助大家理解Shiro的运行机制,这里简单举例说明。假设我们有一个基于MVC 的简单web应用,假设Shiro框架已经配置好,拦截页面的任何请求(如何配置后面会简单介绍)。
1、登录时的身份验证:
(1)MVC中的C(controller)接收页面发来的登录请求,从request中取出页面送来的username, password。
java代码:
String username = ameter(“username");
String password = ameter("password");
(2)构造token对象,装入username和password,用于验证。
java代码:
UsernamePasswordToken mytoken = new
UsernamePasswordToken(username, password); (3)获取当前session的subject对象。
java代码:
Subject curSbj = ject();
(4)登录验证。
java代码:
(mytoken); 若login方法验证失败,会抛出异常,所以本方法应写在一个try catch结构中。
小结:只需要调用subject的方法,不直接访问realm。
2、在执行某个功能时判断当前用户是否有权限执行:
Subject curSbj = ject();
curSbj. isPermitted(“某权限”);
小结:只需要调用subject的方法,不直接访问realm。
3、判断当前用户是否具有某个角色:
Subject curSbj = ject();
e(“某角色”);
小结:只需要调用subject的方法,不直接访问realm。
4、Realm中怎样装入使用者自定义的权限数据
(1)调用(mytoken)方法的请求最终会被SecurityManager发送到realm对象,并调用realm对象的doGetAuthenticationInfo()方法,我们在这个方法中验证是否存在传入的
针对Shiro使用的入门级介绍,目的是快速开始使用。阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
token中的username,并完成password验证。下面具体来看看doGetAuthenticationInfo()方法的代码。
java代码:
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken)
authcToken;
//下面这条语句就是你自己的业务,找到user对象,可以从数据库中取得,也可以从其他地方取得,总之下面的userservice就是你自己写的业务方法。
User u = ByUserName(rname());
if (u != null) {
return new SimpleAuthenticationInfo(rName(),
sword(), getName());
}else{
throw new AuthenticationException();
}
}
那么,SecurityManager怎么找到realm对象呢?通常是通过配置文件配置的,后面会提供配置方法。
(2)调用 Role(“某角色”) 方法的请求最终会被SecurityManager发送到realm对象,并调用realm对象的doGetAuthorizationInfo ()方法,我们在这个方法中取得用户的角色和权限。下面是具体的java代码:
protected AuthorizationInfo
doGetAuthorizationInfo(PrincipalCollection principals) { /* 下面将构造两个set,一个装角色,一个装权限*/
SetString roleNames = new HashSetString
SetString permissions = new HashSetString
User u =
ByUserName5(maryPrincipal().toString());
ListRole roles=es();
for (Role r:roles){
(eCode());
}
ListRight rights=hts();
for (Right ri:rights){
(htName());
}
SimpleAuthorizationInfo info = new
SimpleAuthorizationInfo(roleNames);
ingPermissions(permissions);
return info;
}
四、Shiro里的一些基本概念
1、Subject、SecurityManager、Realm前面已经说明。
2、Principals:身份标识,可以有多个,例如用户名、手机号、邮箱地址等,我们在应用中
针对Shiro使用的入门级介绍,目的是快速开始使用。阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
常用的是用户名。
3、Credentials:证明,可以有多个,例如密码、指纹、数字签名等,我们在应用中常用的是密码。
4、还有一些概念暂不说明,以免一次信息量太大。
五、怎样开始用Shiro
这里只介绍在web应用中如何使用Shiro框架,分为支持包的获得、配置和编码三个部分。我们配合使用的其他框架是springmvc、springweb、mybatis。
1、支持包的获得:
如果使用Maven工程,需要在中加入
dependency
/groupId
artifactIdshiro-spring/artifactId
version1.3.0/version
/dependency
dependency
/groupId
artifactIdshiro-ehcache/artifactId
version1.3.0/version
/dependency
dependency
/groupId
artifactIdshiro-core/artifactId
version1.3.0/version
/dependency
dependency
/groupId
artifactIdshiro-web/artifactId
version1.3.0/version
/dependency
dependency
/groupId
artifactIdshiro-quartz/artifactId
version1.3.0/version
/dependency
2、配置:
(1)在中加入,注意标红的名字,必须在spring配置中写明这个名字对应哪个java bean。
filter
filter-nameshiroFilter/filter-name
tingFilterProxy/filter-class
init-param
param-nametargetFilterLifecycle/param-name
针对Shiro使用的入门级介绍,目的是快速开始使用。阅读本文需要事先有eclipse、maven、spring、springmvc、web应用开发等基础知识。
param-valuetrue/param-value
/init-param
/filter
filter-mapping
filter-nameshiroFilter/filter-name
url-pattern/*/url-pattern
/filter-mapping
(2)在spring配置中加入
指明shiro过滤器的工厂类
bean id="shiroFilter"
class="ilterFactoryBean" property
name="securityManager" ref="securityManager" /
property name="loginUrl" value="/" /
property name="successUrl" value="/" /
property name="unauthorizedUrl" value="/error/" /
property name="filterChainDefinitions"
value
/ = anon
/ = anon
/ = anon
/view/=authc,roles[MASTER]
/** = authc
/value
/property
/bean
告诉shiro我的realm在哪里
bean id="securityManager"
class="tWebSecurityManager" property
name="realm" ref="LqfRealm" /
property name="cacheManager" ref="cacheManager" /
/bean
bean id="LqfRealm" class="lm"
property name="cacheManager" ref="cacheManager" /
/bean
3、编码:在本文第二部分已说明在controller中怎么使用shiro进行登陆和权限验证以及如
何在realm中装入自定义的安全数据。
六、总结
本文只是介绍了Shiro的一些基本概念和用法,目的是让读者能快速上手使用。Shiro框架功能丰富,使用形式多样,需要花时间深入研究和实践。
版权声明:本文标题:开源权限管理框架Shiro 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1707299609h514052.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论