1、shiro概念
(1)相关概念
项目中的密码是用密文存储的,不是明文,否则,会造成安全问题。
不同的功能需要不同的权限,不是所有的人都能访问相应的功能。
只有登录才能进入系统正常使用。
(2)shiro
Apache Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。
摘自:shiro官网http://shiro.apache.org/
(3)工作流程
subject:用户代码直接交互的对象,subject代表当前用户,对外API的核心,subject将所有的交互都为你托给securityManager
securityManager:所有的安全有关的操作都会与securityManager交互,它管理着所有的subject且负责与shiro的其它组件进行交互,是shiro的核心
realm:shiro从realm获取安全数据(用户、权限),当securityManager要验证用户身份的时候,要从realm获取相应的用户进行比较,以确定相应的用户是否合法,呀需要获得用户的相应的角色或权限进行验证,能否进行操作。
2、RBAC模型(Role Base Access Control)
(1)三个主题
用户(zhai、张)、角色(辅导员、学生、院长)、权限
3、Shiro入门程序
(1)新建一个maven项目
(2)导入依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId> commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies>
(3)新建ini文件:
[users] zhao=123,headmaster zhang=123,teacher zhai=123,student [roles] headmaster=* teacher=user:query,user:detail:query student=query
stu=user:query,user:insert //可以简写为 stu="user:query,insert"
//实例级别权限标识 user:update:1,user:update:1 //可以简写为 "user:update,delete:1"
(4)安装Ini插件
(5)用户登录状态:
public class ShiroTest { public static void main(String[] args) { Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini"); //获得了Shiro的核心:SecurityManager SecurityManager securityManager=factory.getInstance(); //将SecurityManager托管到SecurityUtils工具类中(之后可以不必再关心SecurityManager,可以简化操作) SecurityUtils.setSecurityManager(securityManager); //获取subject,直接由用户使用,每个用户独享,通过subject可以执行Shiro的相关操作(加密除外) Subject subject=SecurityUtils.getSubject(); //通过subject获取当前用户的登录状态(从session中同步信息) System.out.println(subject.isAuthenticated()); //通过subject进行身份认证,只要不抛出异常就是成功的 UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("zhai","123"); subject.login(usernamePasswordToken); System.out.println(subject.isAuthenticated()); } }
如果没有异常就代表用户已经登录
false true
(6)身份认证、角色校验、权限校验:
public class ShiroTest { public static void main(String[] args) { Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini"); //获得了Shiro的核心:SecurityManager SecurityManager securityManager=factory.getInstance(); //将SecurityManager托管到SecurityUtils工具类中(之后可以不必再关心SecurityManager,可以简化操作) SecurityUtils.setSecurityManager(securityManager); //获取subject,直接由用户使用,每个用户独享,通过subject可以执行Shiro的相关操作(加密除外) Subject subject=SecurityUtils.getSubject(); //身份认证 if(!subject.isAuthenticated()){ UsernamePasswordToken token=new UsernamePasswordToken("zhai","123"); try { subject.login(token); }catch (UnknownAccountException uas){ System.out.println("用户名不存在"+token.getPrincipal()); }catch (IncorrectCredentialsException ice){ System.out.println("密码错误"+token.getPrincipal()); }catch (LockedAccountException lae){ System.out.println("账户冻结"+token.getPrincipal()); } } System.out.println("用户凭证"+subject.getPrincipal()+"登录成功"); //角色校验&权限校验 if(subject.hasRole("student")){ System.out.println(subject.getPrincipal()+"同学你好"); }else{ System.out.println("你好"); } if(subject.isPermitted("query")){ System.out.println("拥有查询权限"); }else { System.out.println("对不起,您没有查询权限"); } //清除用户的相关信息 subject.logout(); } }