浅谈shiro权限框架之认证过程

1、什么是shiro框架?

是Apache组织下的一套安全的认证框架,是对用户进行认证和授权,具有会话管理功能。它是一个可以快速完成认证、授权等低成本开发的框架。

优点:使用范围广泛:可以用于B/S:集权分布式和C/S

      快速低成本

与同类型Spring security对比:Acegi开源权限管理,非常依赖Spring,使用范围较狭窄、没有shiro框架简单灵活

2、shiro的框架结构

原理:1、用户“登录”,进行用户身份识别(Authentication认证器认证),判断用户是否登陆,如果未登陆,则拦截其请求。

           2、当用户登陆后,判断其身份是否有权限访问相应的资源(Authorization授权器授权),如果没有权限则拦截

Subject(主体):使用范围广泛

Security Manager(安全管理器)-核心接口:通过Authenticator对Subjetct认证,通过后用Authorizer授权。

Authenticator(认证器接口)在与Spring整合后对每个request进行主体身份信息认证,判断该主体是否有此功能的操作权限,提供MoudlarRealmAuthenticator实现类,满足大多数的需求,也可以自定义认证器)如果提交的 credentials 跟应用系统中提供的 credentials 吻合,就能够继续访问,否则需要重新提交 principals 和 credentials,或者直接终止访问。

Authorizer(授权器)在访问时判断主体是否有此功能操作权限。

Realm(权限领域):用于存储数据源,主体权限类的数据。若有用户信息,则通过。

Session Manager:会话管理,不依赖于web,可用于单点登录。

SessionDao:dao层的会话接口,可用于jdbc的会话存储在数据库里。

Cache Manager(缓存管理器):将用户权限存储在缓存中

Cryptography:密码管理=对原始密码+随机数字+MD5 x N(次数)

散列算法:将密码散成几乎无法破解的密码

所需架包

测试认证模块

1、创建shiro.ini配置文件,可以设置多个组protieties,配置参数初始化的工厂Security Manager

#对用户信息进行配置.ini的好处是可以分组[user1]

[users]

#配置分别为userName=password格式

zhangsan=123456

lisi=65321

2、subject认证登录的请求中需要得到身份信息(AuthenticationToken token)实际开发中一般用AuthenticationToken接口的实现类UsernamePasswordToken 来构建token

@Test

       public void testLoginAndLogout(){

              //通过外部配置文件.ini,构建SecurityManager工厂

              Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");

              //设置环境得到工厂管理器

              SecurityManager securityManager=factory.getInstance();

              //用于接收主体请求  单例模式SecurityUtils

              SecurityUtils.setSecurityManager(securityManager);

              //得到主体:各个请求端

              Subject subject=SecurityUtils.getSubject();

              //构造subject的token信息             

              UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123456");

              //执行认证提交

              try {

                     subject.login(token);

              } catch (AuthenticationException e) {

                     // TODO Auto-generated catch block

                     e.printStackTrace();

              }

              //对认证状态进行判断

              boolean isAuthenticated=subject.isAuthenticated();

              System.out.println("是否认证通过"+isAuthenticated);

       }



密码错误时,认证失败,抛出异常

Realm通过加载数据库的权限信息来实现认证,将server和mapper层注入到realm即整合SpringMVC的一个入口,继承如图所示的抽象类AuthenticatingRealm

用于初始化安全管理器工厂

MD5加密不靠谱:穷举法来得到账户密码,并不安全

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值