找回密码
 立即注册
首页 业界区 业界 认识shiro

认识shiro

晚能 昨天 05:35
认证

身份认证:判断一个用户是否为一个合法用户的过程。
认证方式:用户名口令认证、短信验证码、第三方授权。
认证需要的关键对象:

  • Subject:主体,访问系统的用户,主体可以是用户、程序等
  • Principal:身份信息是主体进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址。一个主题可以有多个身份,但必须有一个主身份(Primary Principal)
  • credential:凭证信息,只有主体自己知道的安全信息,如密码、证书
授权

授权:访问控制,控制谁能访问哪些资源。主体进行身份认证后,系统会为其分配对应的权限,当访问资源时,会校验其是否有此权限。
授权需要操作的对象:

  • 用户对象user:当前操作的用户、程序
  • 资源对象Resource:被访问的资源
  • 角色对象role:一组“权限操作许可权”的集合
  • 权限对象permission:权限操作许可权
什么是Shiro

Shiro是一个开源的安全认证框架。实现用户身份认证、权限授权、加密、会话管理等功能。
核心组件

subject

外部程序与subject进行交互,而Subject通过SecurityManager安全管理进行认证授权。
外部程序----------subject---------SecurityManager
SecurityManager(权限管理器)

它是Shiro的核心,对所有subject进行管理。通过SecurityManager完成subject的认证、授权。SecurityManager是通过Authenticator进行认证;通过Authorizer进行授权;通过SessionManager进行会话管理。SecurityManager是一个接口,继承Authenticator、Authorizer、SessionManager这三个接口。
Authenticator(认证器)

对用户登录进行身份认证
Authorizer(授权器)

认证通过后,在访问功能时通过Authorizer判断用户是否有操作权限
Realm(数据库读取+认证功能+授权功能实现)

Realm相当于DataSource数据源。SecurityManager进行安全认证需要通过Realm获取用户权限数据。
比如:用户身份数据在数据库,那么realm需要从数据库获取身份信息。
注意:realm除了从数据源获取身份信息,在realm中还有认证授权校验的相关代码。
SessionManager(会话管理)

Shiro框架定义的一套会话管理系统,它不依赖Web容器的Session,所以Shiro可以用在非Web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
SessionDAO(会话DAO)

可通过jdbc将会话存储到数据库,也可以把 Session存储到缓存服务器。
CacheManager(缓存管理)

将用户权限数据存储在缓存,可以提高性能。
Cryptography(密码管理)

Shiro提供的一套加密/解密组件,比如提供常用的散列、加/解密功能。
Shiro入门

身份认证

认证流程:

  • Shiro把用户的数据封装成标识token,token封装了用户名、密码等信息
  • subject获取到这个标识token
  • subject把标识token交给SecurityManager,在SecurityManager安全中心中,SecurityManager把标识token交给认证器Authenticator进行身份认证。
  • 认证器Authenticator将标识token与数据源Realm对比,验证token是否合法。
代码示例

导入依赖
  1. <dependency>
  2.     <groupId>org.apache.shiro</groupId>
  3.     shiro-core</artifactId>
  4.     <version>1.3.2</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.slf4j</groupId>
  8.     slf4j-log4j12</artifactId>
  9.     <version>1.6.1</version>
  10. </dependency>
  11.     <dependency>
  12.         <groupId>org.apache.logging.log4j</groupId>
  13.         log4j-core</artifactId>
  14.         <version>2.14.1</version>
  15.     </dependency>
  16.     <dependency>
  17.         <groupId>org.apache.logging.log4j</groupId>
  18.         log4j-api</artifactId>
  19.         <version>2.14.1</version>
  20.     </dependency>
复制代码
构造shiro.ini文件
  1. # -----------------------------------------------------------------------------
  2. # users用来定义用户
  3. [users]
  4. # 用户名 = 密码,角色1,角色2...
  5. admin = secret, admin
  6. guest = guest, guest
  7. aa = 123456, guest
  8. # -----------------------------------------------------------------------------
  9. # roles用来定义角色
  10. [roles]
  11. # 角色 = 权限 (* 代表所有权限)
  12. admin = *
  13. # 角色 = 权限 (* 代表所有权限)
  14. guest = see
  15. aa = see
复制代码
示例代码
  1. package demo;
  2. import org.apache.shiro.SecurityUtils;
  3. import org.apache.shiro.authc.*;
  4. import org.apache.shiro.mgt.SecurityManager;
  5. import org.apache.shiro.config.IniSecurityManagerFactory;
  6. import org.apache.shiro.subject.Subject;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. public class ShiroDemo {
  10.     private static final Logger log = LoggerFactory.getLogger(ShiroDemo.class);
  11.     public static void main(String[] args) {
  12.         //1.导入权限ini文件,创建SecurityManagerFactory
  13.         IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
  14.         //2.获取SecurityManager,绑定到SecurityUtils中
  15.         SecurityManager securityManager =factory.getInstance();
  16.         SecurityUtils.setSecurityManager( securityManager);
  17.         //3.获取一个用户主体
  18.         Subject currentUser = SecurityUtils.getSubject();
  19.         UsernamePasswordToken token = new UsernamePasswordToken("guest", "guest");
  20.         currentUser.login(token);
  21.         System.out.println("是否登录成功:"+currentUser.isAuthenticated());
  22.     }
  23. }
复制代码
运行结果

1.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册