zoukankan      html  css  js  c++  java
  • Shiro入门

    Shiro是由Apache提供的一个强大且易用的Java安全开源框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

    在Shrio中主要提供了授权,认证,加密,事务管理(可以不需要web容器 ),web集成,集成等主要功能。

    Shrio主要内容:

    Authentication(授权):有时候就类似于登陆

    Authorization(认证):访问控制,控制是否可以访问某些指定的资源

    SessionManagement(事务管理):即使没有web容器,也可以为用户管理自己的Session

    Cryptography(加密):为数据加密

    还有蓝色部分的一些支持的功能。

    在Shrio里面有三个基本概念:

    Subject:可以理解为当前用户,不一定是人,也有可能是一个线程之类第三方服务的。需要绑定到一个SecurityManager,

    当我们跟一个Subject交互的时候,它把交互内容转换成一个跟SecurityManager的交互信息。

    SecurityManager:是Shrio结构中的核心。管理着所有的Subject。

    Realms:Realm扮演着用户安全数据和Shrio之间的桥梁。当我们认证或者授权的时候,都会去Realms中查找这些信息。

    就像是我们程序中的DAO层,保存着我们数据库的连接信息一样。在SecurityManager中至少需要配置一个Realms,

    但是也可以配置多个。

     Shiro的详细结构:

    Subject和SecurityManager我们上面都说过了,下面就来简单介绍下其他的几个组件。  

     Authenticator:主要负责执行用户的验证操作,去Realms中都需验证信息等等。

    Authentication Strategy:当我们配置了多个Realms的时候,认证策略主要负责觉得我们认证通过的原则。

    Authorizer:主要负责判断用户是否用访问xx资源的权限。

    SessionManager:提供了一个管理session的环境,可以让用户在非web容器的环境下使用session。

    SessionDao:用来持久化session

    CacheManager:用来获取Cache实例,管理缓存,提高效率。

    Cyptography:加密操作

    需要注意的是,这些都是在SecurityManager的管理下的。作为一个轻量级的容器。对操作进行转发。而实际操作都是由各个组件来完成的。

    下面就来简单体验一下,我们使用的是Maven项目。

    下面是pom文件,shiro依赖了slf4j和log4j包。

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.fuwh</groupId>
      <artifactId>shirodemo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
      <dependencies>
          <dependency>
          <groupId>org.apache.shiro</groupId>
          <artifactId>shiro-core</artifactId>
          <version>1.3.2</version>
        </dependency>
          
          <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
          
      </dependencies>
      
    </project>

    需要注意的是,在添加slf4j-log4j12依赖包的时候,在Maven仓库中直接添加的依赖信息中,有scope为test,需要去掉,不然可能会导致下面的错误。

    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

    由于是第一个例子,我们就按照shiro逛网给出的一种简单方式,用配置文件中写入用户名密码的认证方式来体验一下登陆检证。

    [users]
    fuwh=fuwh1234
    package com.fuwh.demo;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class ShiroDemo01 {
        
        private static Logger log=LoggerFactory.getLogger(ShiroDemo01.class);
        public static void main(String[] args) {
            //取得SecurityManager工厂
            Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
            //取得SecurityManager实例
            SecurityManager securityManager=factory.getInstance();
            //将securityManager绑定到SecurityUtil
            SecurityUtils.setSecurityManager(securityManager);
            
            /*    至此为止,简单的shiro环境就配置好了    */
    
            //取得当前用户
            Subject currentUser=SecurityUtils.getSubject();
            //取得当前用户的session
            Session session=currentUser.getSession();
            //可以在web容器中一样使用session
            session.setAttribute("attr","value");
            log.info("取得的值:"+session.getAttribute("attr").toString());
            
            //使用shiro来进行登陆验证
            if(!currentUser.isAuthenticated()) {
                UsernamePasswordToken token=new UsernamePasswordToken("fuwh","fuwh1234");
                try {
                    currentUser.login(token);
                    log.info("登陆成功!!!");
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("认证失败...");
                }
            }
            currentUser.logout();
        }
    }

    这就实现了一个简单的通过Shiro的配置文件来验证登陆。

    当然,Shiro能做的远远不止这些,下面,我们在shiro.ini文件中加入一些角色的验证信息。

    [users]
    fuwh=fuwh1234,admin
    
    [roles]
    admin=lightsaber:test

    修改程序代码如下:

    package com.fuwh.demo;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.session.Session;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class ShiroDemo01 {
        
        private static Logger log=LoggerFactory.getLogger(ShiroDemo01.class);
        public static void main(String[] args) {
            //取得SecurityManager工厂
            Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
            //取得SecurityManager实例
            SecurityManager securityManager=factory.getInstance();
            //将securityManager绑定到SecurityUtil
            SecurityUtils.setSecurityManager(securityManager);
            
            /*    至此为止,简单的shiro环境就配置好了    */
    
            //取得当前用户
            Subject currentUser=SecurityUtils.getSubject();
            //取得当前用户的session
            Session session=currentUser.getSession();
            //可以在web容器中一样使用session
            session.setAttribute("attr","value");
            log.info("取得的值:"+session.getAttribute("attr").toString());
            
            //使用shiro来进行登陆验证
            if(!currentUser.isAuthenticated()) {
                UsernamePasswordToken token=new UsernamePasswordToken("fuwh","fuwh1234");
                try {
                    currentUser.login(token);
                    log.info("登陆成功!!!");
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("认证失败...");
                }
            }
            
            log.info("角色认证开始....");
            if(currentUser.hasRole("admin")) {
                log.info("当前用户有admin角色");
            }else {
                log.info("当前用户没有admin角色");
            }
            
            log.info("权限认证开始....");
            if(currentUser.isPermitted("lightsaber:debug")) {
                log.info("当前用户有lightsaber:debug权限");
            }else {
                log.info("当前用户没有lightsaber:debug权限");
            }
            
            currentUser.logout();
        }
    }
    2017-08-20 21:16:33,432 [main] INFO  [org.apache.shiro.session.mgt.AbstractValidatingSessionManager] - Enabling session validation scheduler...
    2017-08-20 21:16:34,048 [main] INFO  [com.fuwh.demo.ShiroDemo01] - 取得的值:value
    2017-08-20 21:16:34,051 [main] INFO  [com.fuwh.demo.ShiroDemo01] - 登陆成功!!!
    2017-08-20 21:16:34,051 [main] INFO  [com.fuwh.demo.ShiroDemo01] - 角色认证开始....
    2017-08-20 21:16:34,051 [main] INFO  [com.fuwh.demo.ShiroDemo01] - 当前用户有admin角色
    2017-08-20 21:16:34,051 [main] INFO  [com.fuwh.demo.ShiroDemo01] - 权限认证开始....
    2017-08-20 21:16:34,052 [main] INFO  [com.fuwh.demo.ShiroDemo01] - 当前用户没有lightsaber:debug权限

    上面就是运行的结果了....

  • 相关阅读:
    轮播闪白效果
    轮播图效果
    打字游戏简约版
    js购物时的放大镜效果
    单例模式
    docker
    【spring】注解梳理
    【spring源码-1】BeanFactory + XMLBeanFactory
    【设计模式】
    【大数据Spark】PC单机Spark开发环境搭建
  • 原文地址:https://www.cnblogs.com/zerotomax/p/7401219.html
Copyright © 2011-2022 走看看