Realm
Realm作为securityManager的核心,主要解决了一个问题:
从哪里获得Role(角色)和Permission(权限)以供Authentication和Authorization使用
在阅读本文之前首先要了解权限控制的基本概念 : 基于角色的权限控制和基于资源的权限控制(自行百度)
从数据库获得Role和Permission
在通常情况下角色和权限存在于数据库,Shiro提供了一个realm类 org.apache.shiro.realm.jdbc.JdbcRealm 供使用
假设存在以下Table
- users
username | password | salt |
---|---|---|
admin | xxxxxxxxx | sakf3s |
- roles
username | role |
---|---|
admin | su |
- permissions
username | permission |
---|---|
admin | write |
admin | read |
那么我们可以如此配置JdbcRealm
1 | <bean id="sampleRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm"> |
Subject
虽然我们配置好了 org.apache.shiro.realm.jdbc.JdbcRealm 有个疑问出现 sampleRealm 如何判断我想使用哪个username登陆呢?
答案是由 Subject 和 Token 来提供的
Subject是什么
Subject 英文直译主题缘由,是指Security Manager处理信息的集合体,在上一章Shiro与Spring集成中我们讲了 Security Manager 的三个主要功能
- Authentication: 认证
- Authorization: 授权
- Realm: 域
这三个逻辑功能都既不会产生信息,也不会保存信息,都是一些逻辑操作,认证和授权比较容易理解,域本身也仅仅是从数据库拿数据的逻辑,并不会储存或者接收数据
这一切的逻辑处理,都是针对Subject进行处理,Subject才带有信息
将Token带入Subject进行登陆
与 org.apache.shiro.realm.jdbc.JdbcRealm 配合使用的是Class UsernamePasswordToken 其初始化函数需要
- username
- password
最常用的登陆逻辑
1 | UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userReqVO.getUsername(),userReqVO.getPassword()); |
登陆流程
到此为止我们已经阐述了太多的概念,到底怎么登陆??
- Web页面进行登陆操作,输入username和password
- 被 SpringMVC 的 Controller 接收,放入一个Token
- Token 进入 Subject
- Subject进行登陆操作去 Security Manager 验证逻辑
- Security Manager 验证通过OR不通过
反应到代码上就是
1 | // 1. 根据外部数据生成Token |
如果登陆失败 subject.login() 会抛出 Exception
权限管理
在登陆之后就可以进行权限管理了,因为所有的数据和逻辑结果都存在于subject中,所以说subject本身就提供了一系列的函数
1 | SecurityUtils.getSubject().checkRole("admin"); <====是否有某个角色 |
目前为止配置还不能用
到目前为止,Shiro的配置还暂时不能用,因为还有两个不那么重要的问题有待我们处理
- Shiro中的Session
- Shiro中的Cache
将在下章讲解