这两个原理都不一样
springsecurity
的实现原理:
核心
:登陆验证拦截器AuthenticationProcessingFilter
资源管理拦截器AbstractSecurityInterceptor以及AuthenticationManager、accessDecisionManager等组件来支撑。
流程:用户登陆,会被AuthenticationProcessingFilter拦截,调用AuthenticationManager的实现,而且AuthenticationManager会调用ProviderManager来获取用户验证信息(不同的Provider调用的服务不同,因为这些信息可以是在数据库上,可以是在LDAP服务器上,可以是xml配置文件上等),如果验证通过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中,以备后面访问资源时使用。
访问资源(即授权管理),访问url时,会通过AbstractSecurityInterceptor拦截器拦截,其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的全部权限,在调用授权管理器AccessDecisionManager,这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的全部权限,然后根据所配的策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则返回,权限不够则报错并调用权限不足页面
shiro的实现原理:
Shiro的三个核心组件:Subject,
SecurityManager
和
Realms.
Subject:即“当前 *** 作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon
Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。
Subject代表了当前用户的安全 *** 作,SecurityManager则管理所有用户的安全 *** 作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm:
Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。
第一,你是讲userId存放在那个位置@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res,
Object arg2) throws Exception {
System.out.println("SessionInterceptor的preHandle方法")
HttpSession session=req.getSession()
Object obj=session.getAttribute("admin")
if(obj==null){
//没有登录,跳转到登录页面
res.sendRedirect("toLogin.do")
//中断处理流程
return false
}
return true
}
}
第二: 你引入的借口是否正确
implements HandlerInterceptor
第三: 你应该在登录界面进行排除验证,不是所有都使用拦截器
具体就是使用exclude这个属性,进行登录页面加载排除
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)