文档章节

关于Shiro框架的认识

laohng1995
 laohng1995
发布于 2017/07/20 19:47
字数 1774
阅读 41
收藏 0

 Apache shiro 是一个java安全性校验框架,因为其简单和易用,所以开始接触Shiro,据说Spring也有一个安全校验框架,这里因为我只有学习了Shiro所以我就不介绍Spring这款了,以后有机会在去学习吧。

Apache shiro比较易用,如果就一个demo 的话,一个jar包,一个以ini为结尾的配置文件,和一个工厂类就可以了。shiro 可以用在JavaSE 和JavaEE 的环境中。Shiro包含的组件有进行身份校验的Authentication和进行角色校验的Authoritarian,还用realm,Shiro 还实现了Session和Cache等等,所以对于一些共享的数据支持还是比较常用。

下面贴一张经典的图片:

 

Subject主体,可以看到主体可以是任何可以与应用交互的“用户”;

SecurityManager相当于SpringMVC中的DispatcherServlet或者Struts2中的FilterDispatcher;是Shiro的心脏;所有具体的交互都通过SecurityManager进行控制;它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理。

Authenticator认证器,负责主体认证的,这是一个扩展点,如果用户觉得Shiro默认的不好,可以自定义实现;其需要认证策略(Authentication Strategy),即什么情况下算用户认证通过了;

Authrizer授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;

Realm可以有1个或多个Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是JDBC实现,也可以是LDAP实现,或者内存实现等等;由用户提供;注意:Shiro不知道你的用户/权限存储在哪及以何种格式存储;所以我们一般在应用中都需要实现自己的Realm;

SessionManager如果写过Servlet就应该知道Session的概念,Session呢需要有人去管理它的生命周期,这个组件就是SessionManager;而Shiro并不仅仅可以用在Web环境,也可以用在如普通的JavaSE环境、EJB等环境;所有呢,Shiro就抽象了一个自己的Session来管理主体与应用之间交互的数据;这样的话,比如我们在Web环境用,刚开始是一台Web服务器;接着又上了台EJB服务器;这时想把两台服务器的会话数据放到一个地方,这个时候就可以实现自己的分布式会话(如把数据放到Memcached服务器);

SessionDAODAO大家都用过,数据访问对象,用于会话的CRUD,比如我们想把Session保存到数据库,那么可以实现自己的SessionDAO,通过如JDBC写到数据库;比如想把Session放到Memcached中,可以实现自己的Memcached SessionDAO;另外SessionDAO中可以使用Cache进行缓存,以提高性能;

CacheManager缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能

Cryptography密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密的。

 

我想介绍的是shiro 主要的几个功能:

     在介绍功能之前,我先介绍一下Shiro的启动。Shiro启动的是先配置Shiro自身的工厂方法,并且加载配置文件shiro.ini,通过工厂方法获取SecurityManager,并绑定全局作用域SecurityUtil。

     

//1.获取SecurityManager工厂,初始化ini文件。
Factory<org.apache.shiro.mgt.SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-first.ini");
//2.获取文件信息,并且设置全局化
org.apache.shiro.mgt.SecurityManager securityManager=factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

 

介绍了那么多,终于开始进入正题。

第一:

   用户名和密码校验:

   完成上面黑框的代码说明已经实现了全局的配置,下面就是功能的实现,使用SercurityUtil.getSubject()获取Subject对象,创建UsernamePasswordToken(“用户名”,“密码”)并返回相关的令牌,使用Subject的login方法即可实现。

//3.获取Subject
org.apache.shiro.subject.Subject subject=SecurityUtils.getSubject();
UsernamePasswordToken token=new UsernamePasswordToken("zhang","123");
try {
   //4.登录校验
   subject.login(token);
}catch (Exception e){
   System.out.println("密码错误");
}
Assert.assertEquals(true,subject.isAuthenticated());
//5.退出
subject.logout();

  对用户校验的流程主要部分:

  subject.login 会委托给SercurityManager,SercurityManager是正在的逻辑调用,根据校验的内容,SercurityManager对象会调用Authenticator,在Authenticator中会根据你的配置不同选择配置文件和调用jdbcRealm或者自定义的realm,把token传入到里面。realm进行进一步判断。

第二进行角色的校验:

   Subject获取到的是一个公共的SecurityUtil的对象,在Shiro的Subject中可以获取有关角色验证进行授权。

  授权的第一种方式:

Subject subject=SecurityUtil.getSubject();

if(subject.isRole==‘admin’)来进行判读。

   第二种方式:

可以使用@RequiresRoles(“admin”)这种方法来进行校验

关于授权的流程:

如果调用hasRole*,则直接获取Authorizationinfo。getRole与传入角色进行比较,

首先调用如isPermitted(“user:view”),通过PermisstionResolver将权限字符串庄华为Permissiton,通过AuthorizationInfo.getObjectPermissions()得到Permission的实列集合,通过AuthorizationInfo.getStringPermission()得到字符串集合,并通过PermissionResolver装换为Permission视力,通过RolePermissionResolver解析对象权限,最后调用implies组个与传入权限比较。

这里面就提到一个类 AuthorizatingRealm类,自定义的realm继承或者实现这个类以后可以重现或者实现其中关于权限校验和密码校验的方法。

/**
 * Created by pzy on 2017/7/18.
 */
public class UserRealm extends AuthorizingRealm {

    UserService userService=new UserServiceimpl();

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        String username= (String) principalCollection.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
        authorizationInfo.setRoles(userService.findRoles(username));
        authorizationInfo.setStringPermissions(userService.findPermissions(username));
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String username= (String) authenticationToken.getPrincipal();
        User user=userService.selectByUserName(username);
        if(user==null){
            throw new UnknownAccountException();
        }
        if(Boolean.FALSE.equals(user.getLocked())){
            throw new LockedAccountException(); //帐号锁定
        }

        SimpleAuthenticationInfo authenticationInfo=new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),
                ByteSource.Util.bytes(user.getUsername()+user.getSalt()),getName());
        return authenticationInfo;
    }

}

 

就是这个类,通过这个类,就可以自定义实现密码校验和权限给予等。这里写完以后需要在配置文件中给自定义的realm一个配置。

接下来介绍一下Session的配置。在shiro提供了一个独立的Session模块,这个模块有三个Session类,其中一个类是给JavaSE做session的一个类,据说这个类可以在JavaSE中实现Session,但是有一个缺点是不能自动更新最后访问时间。shiro提供了一个默认的Session,

org.apache.shiro.web.session.mgt.DefaultWebSessionManager

,可以调用Tomcat中的Session来实现功能,还有一种是Shiro自己的Session,关于配置问题这里就不详细写,因为网上一大堆。

JavaSE和JavaEE对Shiro中Session对象的获取,通过SercurityUtils.getSugect().getSession()获取自己的Session对象。

© 著作权归作者所有

共有 人打赏支持
laohng1995
粉丝 11
博文 37
码字总数 30590
作品 0
杭州
程序员
私信 提问
轻松带你走进shiro的世界

1.10分钟带你轻松入门shiro Shiro是apache旗下的一款轻量级的Java安全框架,它可以提供如下服务: Authentication(认证) Authorization(授权) Session Management(会话管理) Cryptography(加密...

陈小扁
2016/04/15
138
0
在 Web 项目中应用 Apache Shiro 开源权限框架

Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明你是谁? Web 应用程序一般做法...

IBMdW
2013/02/05
20.7K
38
Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:《跟我学Shiro》系列教程。但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特...

pangfc
2017/01/06
0
0
在 Web 项目中应用 Apache Shiro

用户权限模型 在揭开 Shiro 面纱之前,我们需要认知用户权限模型。本文所提到用户权限模型,指的是用来表达用户信息及用户权限信息的数据模型。即能证明“你是谁?”、“你能访问多少受保护资...

BenettX
2013/08/28
0
0
回首16,展望17。

我是一名在校的大学生,时光流逝转眼就到了该毕业的时间了,大学的四年对于我们来说却只有三年。学校的压缩式教学让我们三年学完了四年的东西,无论你学的怎样都要出去找工作。现在的我也将面...

two_people
2017/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开源软件会被云杀死吗 ?

本文转载云头条,原作者:Michael Stiefel是Reliable Software公司的负责人,是一名软件架构和开发顾问。 文章要点 虽然开源开发不会消失,但商业开源厂商的未来不是很有希望。随着全面管理的...

linuxCool
21分钟前
0
0
OSChina 周三乱弹 —— 谈什么对象?睡什么觉?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @胖达panda :最肯忘却古人诗,最不屑一顾是相思。分享童丽的单曲《红豆生南国》: 《红豆生南国》- 童丽 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
25分钟前
43
3
stylus

stylus基础教程,stylus实例教程,stylus语法总结

miaojiangmin
今天
3
0
PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部