最近的项目中,因为用到了shiro权限控制,小编自己总结了一些。咱们进入正题:
一 做什么:
shiro是Appache旗下的关于权限控制的一个产品,实现了对于权限的控制。是由java语言实现的一个框架,通过一个简单易用的API提供身份验证、授权、加密会话管理等功能。在实现单点登录方面为大型企业系统提供了便利。此外shiro可以实现共享一个session对象,并且没有对应用服务器或web应用服务器存在回话管理依赖。
二 架构:
Subject:操作用户
SecurityManager:管理所有用户的安全操作,他是shiro框架的核心,典型的外观模式,通过SecurityManager来管理内部组件实例,并通过他来实现提供安全管理的各种服务。
Realm:shiro与数据之间起拦截作用,对当前用户执行认证和授权验证,会从realm中查找用户和权限,
完整架构图:
在这张架构图中我们可以看到realm提供多种数据源支持: JDBC连接数据库进行验证,LDAP、ADDS等。
除了我门上面提供的核心组件:subject 、SecurityManager、Realm外,还有Authenticator(认证)、Authorizer(授权)、SessionManager(session管理)、CacheManager(缓存支持)。
Authenticator:核实用户身份,通常是用户密码组合
Authorizer:授权其实就是对资源的控制访问,控制用户能访问应用中的哪些资源或是页面。
SessionManager:控制session,共享session
CacheManager:对shiro的其他组件提供缓存支持。
三 使用
1. 通过加载jar包把shiro 加入到项目中
<dependencies>
<dependency org="commons-logging" name="commons-logging"
rev="1.1.1" conf="dist->default" />
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.5.8"
conf="dist->default" />
<dependency org="org.apache.shiro" name="shiro-core" rev="1.0.0-incubating"
conf="dist->default" />
<dependency org="org.apache.shiro" name="shiro-web" rev="1.0.0-incubating"
conf="dist->default" />
</dependencies>
2. 常用验证方式:
(1) 简单身份验证:
public class ShiroTest {
private static Logger logger = LoggerFactory.getLogger(ShiroTest.class);
public static void main(String[] args) {
// Using the IniSecurityManagerFactory, which will use the an INI file
// as the security file.
Factory<org.apache.shiro.mgt.SecurityManager> factory =
new IniSecurityManagerFactory("auth.ini");
// Setting up the SecurityManager...
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject user = SecurityUtils.getSubject();
logger.info("User is authenticated: " + user.isAuthenticated());
UsernamePasswordToken token = new UsernamePasswordToken("bjangles", "dance");
user.login(token);
logger.info("User is authenticated: " + user.isAuthenticated());
}
}
PS:auth.ini是shiro添加用户的一个配置文件,当然这里也可以直接去数据库查询
(2)LDAP验证:
public static void main(String[] args) {
// Using the IniSecurityManagerFactory, which will use the an INI file
// as the security file.
Factory<org.apache.shiro.mgt.SecurityManager> factory =
new IniSecurityManagerFactory("actived.ini");
// Setting up the SecurityManager...
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject user = SecurityUtils.getSubject();
logger.info("User is authenticated: " + user.isAuthenticated());
UsernamePasswordToken token =
new UsernamePasswordToken(
"cn=Cornelius Buckley,ou=people,o=sevenSeas", "argh");
user.login(token);
logger.info("User is authenticated: " + user.isAuthenticated());
}
总结: shiro还有很多底层的东西需要我们去挖掘,会有那么一天我们自己就能够写出一个shiro框架。