Shrio是什么?

Shrio是一个用Java开发的安全框架,用来保证系统或系统数据安全的。他可以用在大多数程序上,比如移动应用程序、Web程序或者大型的企业应用程序等。


Shrio能干什么?

能用来做身份验证(如:用户名和密码登陆的验证)、授权(如:判断登陆的用户是否具有某个权限)、加密(把密码进行MD5加密成一串代码)、会话管理(类似于Web程序的Session管理)等等。

这里用web程序举例子:

通常用户请求一个资源或者访问一个功能的时候,需要检测下用户是不是登陆状态或者说检测下登陆的用户是不是有这个权限(为了数据安全),一般用session来储存状态的就需要去获取一下Session有没有储存此用户的信息,然后再检测这个用户的权限。这些操作可以说很繁琐。然而shrio已经实现好了,只要调用其一个api就可以验证用户的权限了。

Shrio还提供了在非web程序里也可以使用Session的api操作。


为什么用Shrio?

推荐:传送门1传送门2


Shrio种的一些名词

官网传送门:http://shiro.apache.org/

Subject:主体;代表当前操作对象,这个主体更具不同的操作对象来定。可以是一个程序也可以是一个人。如:一个博客那么操作的是一个人,那么此时的subject就代表当前登陆的用户。验证权限,验证登陆使用这个对象就行了。

SecurityMannager:安全管理;这是整个框架的核心。一些验证操作和实现逻辑都是通过SecurityManage来处理的,调用想使用什么功能调用Subject的接口,然后Subject会自动调用SecurityMananger里面的代码。

Realms:域;如果你熟悉MVC会发现,realms像是个DAO层的东西,这个要根据需求自己实现,至少有一个自己实现的realm,封装跟数据源的链接细节。比如:用户登陆的时候,用户信息(用户名,密码等)存在数据库里。那么再编写reams的时候就可以在里面写一些链接数据库,获取用户名密码等代码了。当然这里举的例子数据源在数据库,也可以是一个配置文件等。


Shrio简单案例

做个用户登陆验证的例子。为了测试的简单,就建库写sql了,直接用个Map代表数据库,详细看第二段。

1、为了方便导包,建个maven程序,并添加依赖。

       <!-- 导入apaceh shrio依赖包 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.4.0</version>
        </dependency>
        <!-- 为了方便测试所以导入了junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency> 

2、实现AuthorizingRealm接口,里面自定义了获取数据源的方式MyRealm

public class MyRealm extends AuthorizingRealm {

    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        String permission1="admin";
        String permission2="common";
        Set<String> permissions=new HashSet<String>();
        permissions.add(permission1);
        permissions.add(permission2);

        Set<String> roles=new HashSet<String>();
        roles.add("admin");

        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        info.setStringPermissions(permissions);
        info.setRoles(roles);
        return info;
    }

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //获取的用户输入的用户名;
        String username=(String) authenticationToken.getPrincipal();
        //模拟从数据库根据用户名获取密码
        String password=getPasswordByUserName(username);

        //获取到为null,就是没有此用户,直接抛出UnknownAccountException异常,代表不存在此用户。
        if(password==null){
            throw new UnknownAccountException();
        }
        //这里的username是获取前端用户输入的,而密password是从数据库中获取的,放到token里框架自动会检测。
        AuthenticationInfo info=new SimpleAuthenticationInfo(username,password,"MyRealm");
        return info;
    }

    //这里模拟从数据库根据用户名获取密码
    public String getPasswordByUserName(String userName){
        Map<String,String> db=new HashMap<String, String>();
        db.put("admin","123456");
        return db.get(userName);
    }

}

3、测试

public class MainTest {

    @Test
    public void test(){
        //模拟用户输入的用户名和密码
        String username="admin";
        String password="123456";

        //生成一个自定义的MyRealm对象,里面有自定义的权限设置和验证方式。
        Realm realm=new MyRealm();

        //讲MyReam当作参数创建一个SecurityManager对象
        //这里的DefaultSecurityManager只是一个SecurityMannager的实现
        SecurityManager securityManager=new DefaultSecurityManager(realm);

        //然后把securityMannager配置到框架中。
        SecurityUtils.setSecurityManager(securityManager);

        //获取代表当前对象,如果没登陆。调用subject.isAuthenticated()会返回false,否则反之。
        Subject subject=SecurityUtils.getSubject();

        //生成一个AuthenticationToken的对象,把用户输入的用户名和密码放进去
        //这个UsernamePasswordToken只是AuthenticationToken的一个实现。
        UsernamePasswordToken token=new UsernamePasswordToken(username,password);

        try {
            //这样就是验证登陆了,这是在try catch中。
            //这就是Shrio的验证方法,如果验证不通过,会直接抛出异常。
            //根据验证不通过的原因,会抛出不同的异常。
            subject.login(token);
        } catch ( UnknownAccountException uae ) {
            //用户名不存在的时候抛的异常
            System.out.println("登陆失败,不存在此用户:"+uae.getMessage());
        } catch ( IncorrectCredentialsException ice ) {
            //密码错误
            System.out.println("登陆失败,密码错误:"+ice.getMessage());

        } catch ( AuthenticationException ae) {
            //其他的异常
            //当然还有更详细的具体异常,看官网文档。
            System.out.println("登陆失败:"+ae.getMessage());
        }

        //使用subject.isAuthenticated()检测是否验证通过,也即使是否登陆成功
        if(subject.isAuthenticated()){
            //获取登陆的用户信息
            System.out.println("用户("+subject.getPrincipal()+")登陆成功!");
            //查看登陆的用户是否有某个权限。详细见:myRealm.doGetAuthorizationInfo()
            System.out.println("用户("+subject.getPrincipal()+")是否有admin权限?"+subject.isPermitted("admin"));
            System.out.println("用户("+subject.getPrincipal()+")是否有common权限?"+subject.isPermitted("common"));
            System.out.println("用户("+subject.getPrincipal()+")是否有super admin权限?"+subject.isPermitted("super admin"));
            //如果登陆成功输出如下:
            //用户(admin)登陆成功!
            //用户(admin)是否有admin权限?true
            //用户(admin)是否有common权限?true
            //用户(admin)是否有super admin权限?false

        }else{
            System.out.println("用户登陆失败");
        }

    }
}

好了,以后任何地方都可以通过Subject subject=SecurityUtils.getSubject();获取当前的登陆对象,然后通过这个subject对后验证是否登陆,验证是否含有权限等操作。


后面记录下在Web里面怎么用Shrio的过滤器。

Apache Shiro——初识的更多相关文章

  1. Apache Shiro系列一,概述 —— 初识

    一.什么是Shiro Apache Shiro是一个强大.灵活.开源的安全框架,它支持用户认证.权限控制.企业会话管理以及加密等. Apache Shiro的第一个也是最重要的一个目标就是易于使用和理 ...

  2. Apache Shiro(一)-登录认证和权限管理初识

    What is Apache Shiro? Apache Shiro是一个功能强大.灵活的,开源的安全框架.它可以干净利落地处理身份验证.授权.企业会话管理和加密. Apache Shiro的首要目标 ...

  3. Apache Shiro系列之五,概述 —— 配置

    Shiro设计的初衷就是可以运行于任何环境:无论是简单的命令行应用程序还是复杂的企业集群应用.由于运行环境的多样性,所以有多种配置机制可用于配置,本节我们将介绍Shiro内核支持的这几种配置机制.   ...

  4. Apache Shiro系列四,概述 —— Shiro的架构

    Shiro的设计目标就是让应用程序的安全管理更简单.更直观.     软件系统一般是基于用户故事来做设计.也就是我们会基于一个客户如何与这个软件系统交互来设计用户界面和服务接口.比如,你可能会说:“如 ...

  5. Apache Shiro系列三,概述 —— 10分钟入门

     一.介绍 看完这个10分钟入门之后,你就知道如何在你的应用程序中引入和使用Shiro.以后你再在自己的应用程序中使用Shiro,也应该可以在10分钟内搞定. 二.概述 关于Shiro的废话就不多说了 ...

  6. Apache Shiro 学习记录5

    本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都 ...

  7. Apache Shiro 学习记录2

    写完上篇随笔以后(链接).....我也想自己尝试一下写一个Strategy.....Shiro自带了3个Strategy,教程(链接)里作者也给了2个.....我想写个都不一样的策略.....看来看去 ...

  8. Apache Shiro系列(1)

    Apache Shiro是啥呢,安全框架. 360百科是这么描述的:        Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架, ...

  9. Apache Shiro 学习记录1

    最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...

随机推荐

  1. Codeforces Round #621 (Div. 1 + Div. 2)E(二分查找,枚举分界点,容斥原理)

    可以把每头牛看作一个位置,有几对牛可以放置相当于有几对位置可以给它睡觉,没有牛可以在其他牛的位置睡觉,所以有几对牛放置的可能答案就乘多少(相当于在原本的两个集合里分别插入一个元素,元素代表它睡觉的位置 ...

  2. ADO.NET中sqlserver和mysql的变量名

    因为ADO.NET标配是访问SQL SERVER数据库,那么如果需要访问MySQL数据库,那么ADO.NET五个对象也必须转换. 访问 SQL SERVER 的ADO.NET对象 1.SqlConne ...

  3. Python :元组,不可修改的序列

  4. tomcat集群搭建集成nginx负载均衡

    软件基础+版本: 1.3台centos7系统,其中都已经配置完成了jdk环境,jdk的版本为 [root@node03 bin]# java -version java version "1 ...

  5. JASON

    JSON 数据格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人 ...

  6. Windows下编译Google.Protobuf在Qt(C++)中使用与Unity3d(C#)交互

    1.首先从Github-Protobuf下载代码,本文下载的版本号是3.1.0. 2.仔细查看各个README,有相关的资源下载和编译说明. 3.在一个方便的地方创建一个Install类型的文件夹,放 ...

  7. ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合

    建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离,希望应用程序中的组件尽可能独立,只有很少的几个可控依赖项.在理想的情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他 ...

  8. 题解【洛谷P1807】最长路_NOI导刊2010提高(07)

    题面 题解 最长路模板. 只需要在最短路的模板上把符号改一下\(+\)初值赋为\(-1\)即可. 注意一定是单向边,不然出现了正环就没有最长路了,就好比出现了负环就没有最短路了. 只能用\(SPFA\ ...

  9. NOIP做题练习(day2)

    A - Reign 题面 题解 最大子段和+\(DP\). 预处理两个数组: \(p[i]\)表示 \(i\) 之前的最大子段和. \(l[i]\)表示 \(i\) 之后的最大子段和. 最后直接输出即 ...

  10. 算法_hdoj_1003

    question: Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...