由自己所想的安全认证框架到shrio的认识过程

我们只在tomcat容器中考虑中这个问题,首先要清楚认识安全认证框架的工作是认证用户,不同的用户有不同的角色,不同的角色就有不同的权限,比如普通用户只能听一首音乐的部分内容,而VIP客户则可以听完整。所以我们怎样设计一个权限认证框架呢?

首先我们知道在Servlet容器里面有一个过滤器接口,通过实现它就可以拦截用户的请求,然后做相应的处理再转发给对应的servlet,所以我们可以通过实现一个Filter接口拦截全部请求来实现我们的框架,通过Filter,我们可以得到ServletRequest和ServletResponse对象就可以获取对象里面的参数进行权限认证了,获取的参数可能很多,我们应该抽象这个参数集合,就用接口AuthenticationToken来抽象把,我们获取参数后将它封装为AuthenticationToken对象,那么获取这个对象又有什么用呢?我们再抽象一个层——接收AuthenticationToken对象的类或者接口,这个类的作用是拿到AuthenticationToken对象进行权限认证处理,我们就用Subject来抽象它吧,代表权限认证的主题或者称为主体,这个类或者接口有个方法的参数是AuthenticationToken对象,拿到这个对象就可以进行认证了。但有个问题——权限认证数据源来哪?可能来自文件,更多的是数据库存储的用户信息,所以我们必须再抽象一个层——Realm,中文意思是领域,代表的就是一个权限认证数据源,Subject对象拿到AuthenticationToken对象,首先的任务是得到一个合适的Realm对象,怎样才能得到合适的呢?所以在Realm必须有一个抽象方法判断是否支持这个AuthenticationToken对象,Subject对象的任务找到支持的Realm对象,方法是通过遍历所有的Realm对象,如果某个支持当前AuthenticationToken对象,则后面的就不遍历了,然后就可以认证了。那得到支持的Realm对象然后呢?肯定是把AuthenticationToken对象传递给这个Realm对象,,所以Realm也有一个抽象方法的方法参数是AuthenticationToken对象,返回结果是认证结果的内容,这个内容不能单纯的返回true或者false,我们再来抽象它——AuthenticationInfo,认证信息代表认证的结果。

上面说了这么多,让我们来总结一下,简单的调用链是
AuthenticationToken对象
——>Subject.login(AuthenticationToken)
——>Realm.support(AuthenticationToken)
——>Realm.getAuthenticationInfo(AuthenticationToken)
——>AuthenticationInfo对象

可以看出是Subject对象最终拿到了AuthenticationInfo对象,然后拿到认证结果就可以进行相应处理了,那怎么样进行处理呢?比如我们只是简单地将用户名密码封装在AuthenticationToken对象中,然后调用与数据库相关的Realm进行比较,返回比较结果AuthenticationInfo对象,我们拿到它应该作一些什么处理呢?比如从这个对象知道它是普通用户对象,那就应该进行拦截,那怎样才能知道呢?作为第三方框架,可不知道程序的业务逻辑是怎么样的所以应该有个管家来事实这种策略,我们可以抽象这个管家为——SecurityManager,Subject拿到AuthenticationInfo对象,然后把对象传递给它,作相应处理,显而易见,SecurityManager对象的初始化应该根据我们的业务逻辑,所以需要配置文件之类来配置,我们把这个文件称作shrio.ini吧

下面我们来总结这个过程
——>拿到AuthenticationInfo对象
——>SecurityManager.execute(AuthenticationInfo)

上面我从容易想到的角度分析了一个安全认证框架的基本内容,但shrio真的这么简单,显而易见这是不可能的,看源码就知道有多复杂了,而我们上面提到的内容,真正首先起来代码量可能都不够1000行,其实shrio的大概设计思路就是这样,只是做了很多细节可以扩展,比如下面的内容:

1、通过 ShiroHttpServletRequest 来包装 Request
2、通过 ShiroHttpServletResponse 来包装 Response
3、通过 Session 来代理 HttpSession
4、提供 FilterChain 的代理机制
5、使用 ThreadContext 来保证线程安全

猜你喜欢

转载自blog.csdn.net/weixin_42002747/article/details/103727532