Shiro浅显理解

来源:互联网 发布:mysql攻击全攻略 编辑:程序博客网 时间:2024/06/16 01:24

Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入

Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

用户赋予角色。角色拥有权限

添加依赖shiro-core

shiro.ini:

[users]

java=123 (用户名=密码)

java=123,admin(用户名=密码,角色)

[roles]

role1=user:select(role1角色拥有user:select权限)

teacher

[main]

authc.loginUrl=/login //这个是跳转到登录界面

roles.unauthourized=/unanthorized.jsp //用户认证  

perms.unauthourized=//unanthorized.jsp //权限认证

[urls]

/login=anon //不用权限,不需要认证

/admin=authc //需要进行身份认证,跳转到拦截器,身份认证通过就能访问

/student=roles[teacher]  //roles.unauthourized=/unanthorized.jsp //用户认证  

/teacher=perms["user:create"]  //perms.unauthourized=//unanthorized.jsp //权限认证

currentUser.hasRole("Role1");

currentUser.isPermitted("user:select");

currentUser.checkPermission("user: select");

角色是权限的集合,用户是Subject,Subject currentUser

所有的请求都会被shiro拦截跳转到指定链接 /*

  1. public void testHelloworld() {  
  2.     //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager  
  3.     Factory<org.apache.shiro.mgt.SecurityManager> factory =  
  4.             new IniSecurityManagerFactory("classpath:shiro.ini");  
  5.     //2、得到SecurityManager实例 并绑定给SecurityUtils  
  6.     org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();  
  7.     SecurityUtils.setSecurityManager(securityManager);  
  8.     //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)  
  9.     Subject subject = SecurityUtils.getSubject();  
  10.     UsernamePasswordToken token = new UsernamePasswordToken("zhang""123");  
  11.   
  12.     try {  
  13.         //4、登录,即身份验证  
  14.         subject.login(token);  
  15.     } catch (AuthenticationException e) {  
  16.         //5、身份验证失败  
  17.     }  
  18.   
  19.     Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录  
  20.   
  21.     //6、退出  
  22.     subject.logout();  

Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。如我们之前的ini配置方式将使用org.apache.shiro.realm.text.IniRealm。

  1. public class MyRealm1 implements Realm {  
注解式授权


@RequiresAuthentication

@RequeresPermissions
@RequireRoles