Shiro的统一认证授权
Shiro是Apache下面的一个简单,易用的Java权限框架,对于单体应用来讲,Shiro完全能够极好的,快速的满足权限的需求,所以一般在做项目的时候,Shiro都会成为开发者的首选。
可是,如果你需要做第二个,第三个,第n个应用,同样需要相同的认证、授权时,可能就需要对Shiro进行一定的扩展或者是集成其它框架,才能很好的满足你的需求了。
Shiro是如何进行认证授权
Shiro本身并没有帮你实现认证、授权,但Shiro很好的定义了权限相关的一些概念,让你完成具体的实现
- 认证
在Shiro里,完成认证一般是这样的subject.login(token),Subject代表一个用户,Token代表一个用户请求授权时提交的授权信息,通过AuthenticatingRealm.doGetAuthenticationInfo()获取到当前Subject的一些信息,比如Principals,Credentials,校验提交的token,如果登录成功,保存当前登录用户 - 授权
在Shiro里,权限控制一般是这样的@RequiresPermissions,当用户访问受保护资源的时候,Shiro会通过AuthorizingRealm.doGetAuthorizationInfo(),从当前认证通过Subject的Principals里获取用户的权限,判断用户是否能访问该资源
在Shiro里,通过实现Realm来完成上面2件事情,当你时单体应用的时候,非常简单就能完成应用的认证授权。
但是当你有多个应用,需要复用同一套用户以及权限信息时该怎么做呢,可以复用Realm,用户权限在同一个db中,这样的话是可以实现的,但是耦合太高,不同的应用必须要接入同一个数据源才行;或者可以把用户权限相关的DAO剥离出来,作为RPC或Rest调用,也可以实现;但是更好的方式是把认证授权整个剥离出来,单独作为认证授权服务
基于Shiro的统一认证授权
为了实现统一认证授权,Shiro有CasFilter,可以集成CAS,但是CAS又是另外一套框架,较为重,有单独的学习成本,所以这里介绍一种更简单,轻量,易用的,基于Shiro的认证授权服务shiro-uaa
认证授权流程
- 用户请求受保护资源Resource Server
- Resource Server判断用户是否已经登录
- 如果没有登录,Resource Server引导用户到UAA Server进行登录
- 用户在UAA Server登录,如果登录成功,UAA Server返回code给用户,并引导用户到之前访问的Resource Server
- Resource Server用code到UAA Server获取access-token,token包含用户授权信息
- Resource Server验证accessToken是否合法,如果合法,在Resource Server保存用户信息
如下图:
使用
-
auth-server
- 引用maven
- 实现自己的登录
-
resource-server
- 引用maven
- 和shiro一样,使用相关注解进行权限控制
基本上开箱即用,目前auth-server只是作为jar包提供,需要自己实现登录逻辑,后续会有可部署服务
shiro-uaa具体的相关说明介绍可以查看项目地址
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。