Apache Shiro 是 Java 的一个安全框架。

Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等

shiro AccessControlFilter 使用_apache

Realm 类似与数据源  

            一、org.apache.shiro.realm.text.IniRealm   使用最简单配置

           二、jdbcRealm 与数据库进行交互


Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者; 


 SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;


 

 


 使用 IniRealm数据源 例子:

   依赖

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.4.1</version>
    </dependency>
  </dependencies>

shiro.ini文件 

[users]
wang=123,admin,guest
liu=123,guest
# 用户对应角色  角色对应权限
[roles]
admin=select,save,update,delete
guest=select,update

测试文件

package com.qust;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class shiroTest {

    @Test
    public void shiro(){
        //获取securityManagerFactory的工厂 使用IniSecurityManagerFactory; 如果ini文件名为shiro.ini 那么是不用写配置文件名
        IniSecurityManagerFactory securityManagerFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //通过创建的工厂 获取 securityManager对象 (securityManager 类似于 springMVC上的 dispaterServlet)
        SecurityManager securityManager = securityManagerFactory.getInstance();
        //SecurityUtils工具类进行绑定 SecurityManager 这是一个全局设置,设置一次即可
        SecurityUtils.setSecurityManager(securityManager);
        //通过 SecurityUtils 得到 Subject,其会自动绑定到当前线程
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("wang","123");
        try {
            //调用 subject.login 方法进行登录,其会自动委托给 SecurityManager.login 方法进行登录
            subject.login(usernamePasswordToken);
        } catch (UnknownAccountException e) {  //未知账户异常
            e.printStackTrace();
        } catch (LockedAccountException e){ //锁定账户
            e.printStackTrace();
        } catch (DisabledAccountException e){ //账户不可用异常
            e.printStackTrace();
        } catch (ExcessiveAttemptsException e){ //登录次数过多异常
            e.printStackTrace();
        } catch (IncorrectCredentialsException e){ //错误的凭证
            e.printStackTrace();
        } catch (ExpiredCredentialsException e){ //过期的凭证
            e.printStackTrace();
        } catch (AuthenticationException e){ //上面异常的父异常
            e.printStackTrace();
        }

        System.out.println("成功!");

        //判断该用户是否有该角色 返回boolean
        System.out.println(subject.hasRole("admin"));
        //判断该用户是否拥有该权限 返回boolean
        System.out.println(subject.isPermitted("select"));

    }
}

 


只有shiro.ini文件配置不同   另外再加三个依赖

依赖 

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.47</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.21</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.18.RELEASE</version>
    </dependency>

JDBCRealm例子; 

dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource
dataSource.url=jdbc:mysql://localhost:3306/work1
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.username=root
dataSource.password=admin

jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
#自定义查询语句 详见jdbcRealm类
jdbcRealm.authenticationQuery=select password from user where username = ?
securityManager.realms=$jdbcRealm

变量名=全类名 相当于该类的实列

变量名.属性=setter方法赋值

$变量名 引用 对象实列