shiro简介
shiro是一个安全管理框架,类似spring security,但是比spring security更方便快捷,且不光适用于web环境,还可适用于java se,EJB项目等,应用非常广泛。
shiro的作用
- 认证 身份认证 登录
- 授权,权限验证
- 加密 保护数据的安全性,把数据加密后再增加
- 会话管理 用户登录后就是一场会话,在没有退出之前,所有信息全在会话中
- 缓存 在用户登录后,用户信息和拥有的角色和权限不需要每次都去查,可以提高效率 存入缓存
- 并发 concurency 支持多线程应用的并发验证,如在一个线程中开启另外一个线程,可以把权限自动传播
shiro架构
subject: 主体,代表当前的用户 所有的subuject都要绑定到securityManger
securityManager:安全管理器,所有和安全相关的操作
Realm:域, shiro从realm获取安全数据,如用户权限等,就是说如果securityManager要验证用户身份,那么它需要从realm中获得数据来进行安全性的比较
此部分可以参考shiro官网介绍 http://shiro.apache.org/architecture.html
在java se的环境下搭建shiro
- shiro.ini文件的配置格式
[users]
#提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2
username=password,role1,role2
[roles]
#提供了角色及权限之间关系的配置,角色=权限1,权限2
role1=permission1,permission2
格式:
用户名=密码,角色1,角色2...
角色对应的权限
角色=权限
简单的javase demo
基于maven配置javase
- 配置pom.xml文件,导入需要的相应jar包
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yuanjun</groupId>
<artifactId>SSM</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>SSM Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<finalName>SSM</finalName>
</build>
</project>
- shiro.ini配置文件,主要配置用户名 密码 以及对应用户所拥有的权限
[users]
zhang=123,kk
wang=123
[roles]
kk = edit
- java文件
package com.zyx.SSM.javase;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
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;
/**
* shiro 认证用户
* @author zyx
*
*/
public class TestShiroSE {
private static final Logger log = LoggerFactory.getLogger(TestShiroSE.class);
public static void main(String[] args) {
log.info("测试log");
/**
* 1. 获取安全管理器
* 2. 获取用户
* 3. 用户登录验证
* 4. 权限管理
* 5. 角色管理
* 6. session:用户登录到用户退出,作用域
*/
//1. 获取安全管理器
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//2. 获取securityManager
SecurityManager securityManager = factory.getInstance();
//3. 需要设置安全管理器
SecurityUtils.setSecurityManager(securityManager);
//4. 获取subject对象,即将登录的对象
Subject subject = SecurityUtils.getSubject();
//5. 获取session
Session session = subject.getSession();
session.setAttribute("name", "酸酱");
String value = (String) session.getAttribute("name");
if (value != null) {
log.info("拿到session中的name" + value);
}
if(subject.isAuthenticated() == false) {
//UsernamePasswordToken 登录
UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");
token.setRememberMe(true);
try {
subject.login(token);
log.info("用户名密码正确,登录成功啦");
} catch (UnknownAccountException e) {
log.error("账户不存在");
} catch(IncorrectCredentialsException e) {
log.error("密码错误");
} catch(LockedAccountException e) {
log.error("用户已经锁死");
} catch (AuthenticationException e) {
log.error("认证异常");
}
//判断用户是否具有特定的角色
if (subject.hasRole("kk")) {
log.info("拥有指定的角色");
} else {
log.info("不具有指定的角色");
}
//判断用户是否有指定参数的权限
if (subject.isPermitted("edit")) {
log.info("拥有指定的权限");
} else {
log.info("不拥有指定的权限");
}
//退出登录
subject.logout();
}
}
}
- 测试结果