【shiro】基于url的权限管理和shiro的对比
♦基于URL的权限管理
这种是企业中比较常用的,用的是web应用中filter来实现,用户请求URL,通过filter拦截,判断用户身份是否合法(用户认证),判断请求的地址是否是用户权限范围内的URL(授权)
认证过程:
①判断是否是公开的地址url(不登录也能用的)
②判断session里面是否存在值。(验证成功,登陆的时候,会把用户信息存到session里面)
③如果前两者都不符合,就用Interceptor拦截器,去跳转登陆页面,去进行登陆。(登陆的时候去查询数据库,一般的验证用户名和密码是否一致的方法就行)
登陆的结果:如果认证成功,则返回用户的信息(并存到session)里面,如果不成功,则返回null
授权过程:
①判断是否公共的地址(任何登陆的人都能用的)
② 通过登陆的人的信息,(根据这个人的角色,去查看这个人拥有哪些url地址的访问权限,这些信息都在数据库里存放,建5个表,吧user /role/资源url连接起来就行)但是这个信息通常是存在redis(session)这种不影响数据库性能,而且快速的缓存中。
③如果访问的地址在②查出来的循环一下的列表里,就放行,如果不在就直接跳转页面(无法访问)
♦shiro
shiro是一个权限管理框架,相比于Spring security框架更简单灵活,Spring security对Spring依赖性较强,shiro可以实现web系统,cs,分布式系统等系统的权限管理。
认证流程:
1、subject(主体)请求认证,调用subject.login(token)
2、SecurityManager (安全管理器)执行认证
3、SecurityManager通过ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator将token传给realm,realm根据token中用户信息从数据库查询用户信息(包括身份和凭证)
5、realm如果查询不到用户给ModularRealmAuthenticator返回null,ModularRealmAuthenticator抛出异常(用户不存在)
6、realm如果查询到用户给ModularRealmAuthenticator返回AuthenticationInfo(认证信息)
7、ModularRealmAuthenticator拿着AuthenticationInfo(认证信息)去进行凭证(密码 )比对。如果一致则认证通过,如果不致抛出异常(凭证错误)。
授权过程:
1、对subject进行授权,调用方法isPermitted("permission串")
2、SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
3、ModularRealmAuthorizer执行realm(自定义的CustomRealm)从数据库查询权限数据调用realm的授权方法:doGetAuthorizationInfo
4、realm从数据库查询权限数据,返回ModularRealmAuthorizer
5、ModularRealmAuthorizer调用PermissionResolver进行权限串比对
6、如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常。