shiro原理实践+++
最近的项目中,因为用到了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框架。
- 上一篇: angularjs数组判断是否含有某个元素
- 下一篇: pc端页面转成手机端页面