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框架功能丰富,使用形式多样,需要花时间深入研究和实践。


本文标签: 方法 对象 应用 使用 用户