介绍:是一个java的安全(权限)框架
可以完成的功能:认证登录(Authentication)、授权(Authorization)、加密(cryptography)、会话管理(session management)、集成web(web support)、缓存(caching)、记住密码(remember me)。
类似功能的框架:Spring security 。
shiro的执行流程(从外部来看):应用程序->subject->Shiro SecurityManager->Realm.
subject shiro对外API核心就是Subject 。Subject代表当前用,这个登录对象不一定是人,可以是网络爬虫,机器人等。与Subject所有交互都会委托给SecurityManager,Subject是门面,SecurityManager才是真正的执行者。
SecurityManager 安全管理器:
所有与安全有关的操作都会放在SecurityManager中交互;
管理所有的Subject;
它是Shiro的核心,负责与shiro的其他组件进行交互,相当于SpringMVC中的DispatcherServlet。Realm Shiro从Realm中获取安全数据(角色、用户、权限),它要验证用户身份,需要从Realm中获取相应的用户进行比较确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作,可以把Realm看成一个DataSource。
在Realm中,数据先从缓存中获取,如果在缓存中取不到再到数据库中获取,然后将数据放入缓存中。
一. Subject对象:Subject subject = SecurityUtils.getSubject()
;
通过获取subjecet对象后,Subject可以做很多事:
subject.getSession()
;获取session对象,在获取到session后,就可以往session中存放session值了。subject.isAuthenticated()
;判断当前对象是否被认证,即是否登录。subject.login(token)
;subject.hasRole('role')
;对当前用户判断是否有一些角色信息.subject.isPermitted('user:delete:zhangsan')
; 判断当前主体是否有权限.判断用户是否有某种行为.当前代表user能够对zhangsan进行delete操作.subject.logout()
; 执行登出操作.
在subject调用login()方法的时候 , 会出现一些异常,这时候需要我们进行手动捕获这些异常,这些异常可能有 用户名不存在 UnknownAccountException
密码不正确IncorrectCredentialsException
账户被锁定LockedAccountException
以及其他的认证异常(AuthenticationException
).
二. token对象(): Shiro给我们提供了一个UsernamePasswordToken
对象,其中封装了有username
password
rememberMe
host
属性,其中我们可以对token对象进行继承并自定义,如添加是否是手机登录,添加email,别名等.subject判断当前登录主体是否被认证,如果发现没有登录,则需要将当前subject对象的信息放入到token中,subject对token进行登录验证.