- 浏览: 1201034 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
insistboy:
写的太棒了,受不了
WebLogic11g-创建域(Domain) -
goldyeah:
厉害了 困扰我大半个月的问题解决了 谢谢博主
WebLogic11g-单双向SSL配置(以Springside3为例) -
zy315351965:
404伤不起
开源流程引擎Snaker -
nannan408:
双向的时候谷歌提示“不接受您的登录证书,或者您可能没有提供登录 ...
WebLogic11g-单双向SSL配置(以Springside3为例) -
一颗赛艇:
不成功啊。启动有问题 <Security> < ...
WebLogic11g-单双向SSL配置(以Springside3为例)
Spring Security3源码分析-CAS支持
- 博客分类:
- Spring Security
Spring Security3对CAS的支持主要在这个spring-security-cas-client-3.0.2.RELEASE.jar包中
Spring Security和CAS集成的配置资料很多。这里讲解的比较详细
http://lengyun3566.iteye.com/blog/1358323
配置方面,主要为下面的部分:
<security:http auto-config="true" entry-point-ref="casAuthEntryPoint" access-denied-page="/error/403.jsp"> <security:custom-filter ref="casAuthenticationFilter" position="CAS_FILTER"/> <security:form-login login-page="/login.jsp"/> <security:logout logout-success-url="/login.jsp"/> <security:intercept-url pattern="/admin.jsp*" access="ROLE_ADMIN"/> <security:intercept-url pattern="/index.jsp*" access="ROLE_USER,ROLE_ADMIN"/> <security:intercept-url pattern="/home.jsp*" access="ROLE_USER,ROLE_ADMIN"/> <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/> </security:http> <security:authentication-manager alias="authenticationmanager"> <security:authentication-provider ref="casAuthenticationProvider"/> </security:authentication-manager> <bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider"> <property name="ticketValidator" ref="casTicketValidator"/> <property name="serviceProperties" ref="casService"/> <property name="key" value="docms"/> <property name="authenticationUserDetailsService" ref="authenticationUserDetailsService"/> </bean> <bean id="casAuthEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint"> <property name="loginUrl" value="https://server:8443/cas/login"/> <property name="serviceProperties" ref="casService"/> </bean> <bean id="casService" class="org.springframework.security.cas.ServiceProperties"> <property name="service" value="http://localhost:8888/docms/j_spring_cas_security_check"/> </bean> <bean id="casAuthenticationFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter"> <property name="authenticationManager" ref="authenticationmanager"/> </bean> <bean id="casTicketValidator" class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator"> <constructor-arg value="https://server:8443/cas/"/> </bean> <bean id="authenticationUserDetailsService" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> <property name="userDetailsService" ref="userDetailsManager"/> </bean>
这里需要强调一下http标签的entry-point-ref属性,因为之前没有着重的介绍,英文的意思是入口点引用。为什么需要这个入口点呢。这个入口点其实仅仅是被ExceptionTranslationFilter引用的。前面已经介绍过ExceptionTranslationFilter过滤器的作用是异常翻译,在出现认证异常、访问异常时,通过入口点决定redirect、forward的操作。比如现在是form-login的认证方式,如果没有通过UsernamePasswordAuthenticationFilter的认证就直接访问某个被保护的url,那么经过ExceptionTranslationFilter过滤器处理后,先捕获到访问拒绝异常,并把跳转动作交给入口点来处理。form-login的对应入口点类为LoginUrlAuthenticationEntryPoint,这个入口点类的commence方法会redirect或forward到指定的url(form-login标签的login-page属性)
清楚了entry-point-ref属性的意义。那么与CAS集成时,如果访问一个受保护的url,就通过CAS认证对应的入口点org.springframework.security.cas.web.CasAuthenticationEntryPoint类redirect到loginUrl属性所配置的url中,即一般为CAS的认证页面(比如:https://server:8443/cas/login)。
下面为CasAuthenticationEntryPoint类的commence方法。其主要任务就是构造跳转的url,再执行redirect动作。根据上面的配置,实际上跳转的url为:https://server:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8888%2Fdocms%2Fj_spring_cas_security_check
public final void commence(final HttpServletRequest servletRequest, final HttpServletResponse response, final AuthenticationException authenticationException) throws IOException, ServletException { final String urlEncodedService = createServiceUrl(servletRequest, response); final String redirectUrl = createRedirectUrl(urlEncodedService); preCommence(servletRequest, response); response.sendRedirect(redirectUrl); }
接下来继续分析custom-filter ref="casAuthenticationFilter" position="CAS_FILTER"
这是一个自定义标签,并且在过滤器链中的位置是CAS_FILTER。这个过滤器在何时会起作用呢?带着这个疑问继续阅读源码
CasAuthenticationFilter对应的类路径是
org.springframework.security.cas.web.CasAuthenticationFilter
这个类与UsernamePasswordAuthenticationFilter一样,都继承于AbstractAuthenticationProcessingFilter。实际上所有认证过滤器都继承这个抽象类,其过滤器本身只要实现attemptAuthentication方法即可。
CasAuthenticationFilter的构造方法直接向父类的构造方法传入/j_spring_cas_security_check用于判断当前请求的url是否需要进一步的认证处理
public CasAuthenticationFilter() { super("/j_spring_cas_security_check"); }
CasAuthenticationFilter类的attemptAuthentication方法源码如下
public Authentication attemptAuthentication(final HttpServletRequest request, final HttpServletResponse response) throws AuthenticationException { //设置用户名为有状态标识符 final String username = CAS_STATEFUL_IDENTIFIER; //获取CAS认证成功后返回的ticket String password = request.getParameter(this.artifactParameter); if (password == null) { password = ""; } //构造UsernamePasswordAuthenticationToken对象 final UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); //由认证管理器完成认证工作 return this.getAuthenticationManager().authenticate(authRequest); }
在之前的源码分析中,已经详细分析了认证管理器AuthenticationManager认证的整个过程,这里就不再赘述了。
由于AuthenticationManager是依赖于具体的AuthenticationProvider的,所以接下来看
<security:authentication-manager alias="authenticationmanager"> <security:authentication-provider ref="casAuthenticationProvider"/> </security:authentication-manager>
注意这里的ref属性定义。如果没有使用CAS认证,此处一般定义user-service-ref属性。这两个属性的区别在于
ref:直接将ref依赖的bean注入到AuthenticationProvider的providers集合中
user-service-ref:定义DaoAuthenticationProvider的bean注入到AuthenticationProvider的providers集合中,并且DaoAuthenticationProvider的变量userDetailsService由user-service-ref依赖的bean注入。
由此可见,采用CAS认证时,AuthenticationProvider只有AnonymousAuthenticationProvider和CasAuthenticationProvider
继续分析CasAuthenticationProvider是如何完成认证工作的
public Authentication authenticate(Authentication authentication) throws AuthenticationException { //省略若干判断 CasAuthenticationToken result = null; //注意这里的无状态条件。主要用于无httpsession的环境中。如soap调用 if (stateless) { // Try to obtain from cache //通过缓存来存储认证实体。主要避免每次请求最新ticket的网络开销 result = statelessTicketCache.getByTicketId(authentication.getCredentials().toString()); } if (result == null) { result = this.authenticateNow(authentication); result.setDetails(authentication.getDetails()); } if (stateless) { // Add to cache statelessTicketCache.putTicketInCache(result); } return result; } //完成认证工作 private CasAuthenticationToken authenticateNow(final Authentication authentication) throws AuthenticationException { try { //通过cas client的ticketValidator完成ticket校验,并返回身份断言 final Assertion assertion = this.ticketValidator.validate(authentication.getCredentials().toString(), serviceProperties.getService()); //根据断言信息构造UserDetails final UserDetails userDetails = loadUserByAssertion(assertion); //检查账号状态 userDetailsChecker.check(userDetails); //构造CasAuthenticationToken return new CasAuthenticationToken(this.key, userDetails, authentication.getCredentials(), userDetails.getAuthorities(), userDetails, assertion); } catch (final TicketValidationException e) { throw new BadCredentialsException(e.getMessage(), e); } } //通过注入的authenticationUserDetailsService根据token中的认证主体即用户名获取UserDetails protected UserDetails loadUserByAssertion(final Assertion assertion) { final CasAssertionAuthenticationToken token = new CasAssertionAuthenticationToken(assertion, ""); return this.authenticationUserDetailsService.loadUserDetails(token); }
需要注意的是为什么要定义authenticationUserDetailsService这个bean。由于CAS需要authentication-manager标签下定义<security:authentication-provider ref="casAuthenticationProvider"/>,而不是之前所介绍的
user-service-ref属性,所以这里仅仅定义了一个provider,而没有注入UserDetailsService,所以这里需要单独定义authenticationUserDetailsService这个bean,并注入到CasAuthenticationProvider中。
这里需要对CasAuthenticationToken、CasAssertionAuthenticationToken单独解释一下
CasAuthenticationToken:一个成功通过的CAS认证,与UsernamePasswordAuthenticationToken一样,都是继承于AbstractAuthenticationToken,并且最终会保存到SecurityContext上下文、session中
CasAssertionAuthenticationToken:一个临时的认证对象用于辅助获取UserDetails
配置文件中几个bean定义这里就不一一分析了,都是为了辅助完成CAS认证、跳转的工作。
现在,可以对整个CAS认证的过程总结一下了:
1.客户端发起一个请求,试图访问系统系统中受保护的url
2.各filter链进行拦截并做相应处理,由于没有通过认证,ExceptionTranslationFilter过滤器会捕获到访问拒绝异常,并把该异常交给入口点处理
3.CAS 认证对应的入口点直接跳转到CAS Server端的登录界面,并携带参数service(一般为url:……/j_spring_cas_security_check)
4.CAS Server对登录信息进行处理,如果登录成功,就跳转到应用系统中service指定的url,并携带ticket
5.应用系统中的各filter链再次对该url拦截,此时CasAuthenticationFilter拦截到j_spring_cas_security_check,就会对ticket进行验证,验证成功返回一个身份断言,再通过身份断言从当前应用系统中获取对应的UserDetails、GrantedAuthority。此时,如果步骤1中受保护的url权限列表有一个权限存在于GrantedAuthority列表中,说明有权限访问,直接响应客户端所试图访问的url
评论
目前我的执行到了此步,就直接报 没有权限。我断点跟也没有调用userdetailservice
请教下这块能详细的给我解释下吗?我刚刚使用这个不太懂,项目着急谢谢了!
没有详细的日志,我大概说下吧。
1.检查authentication-manager配置是否正确
<security:authentication-manager alias="authenticationmanager"> <security:authentication-provider ref="casAuthenticationProvider"/> </security:authentication-manager>
2.检查userDetailsManager配置是否正确:authenticationManager引用上面的authenticationmanager
<bean id="userDetailsManager" class="org.springframework.security.provisioning.JdbcUserDetailsManager"> …… <property name="authenticationManager" ref="authenticationmanager"></property>
3.检查权限配置是否正确。如果没有调用userdetailservice方法,那应该是casAuthenticationProvider配置的问题了
目前我的执行到了此步,就直接报 没有权限。我断点跟也没有调用userdetailservice
请教下这块能详细的给我解释下吗?我刚刚使用这个不太懂,项目着急谢谢了!
发表评论
-
Spring Security3源码分析-电子书下载
2012-07-30 14:34 8615提供电子书下载链接。 -
Spring Security3源码分析-SSL支持
2012-05-10 12:48 11156Sping Security3对于SSL的支持仅仅表现在对需要 ... -
Spring Security3源码分析-认证授权分析
2012-05-09 21:59 6469前面分析了FilterChainProxy执行过程,也对常用的 ... -
Spring Security3源码分析-Filter链排序分析
2012-05-09 14:39 15440通过前面Spring Security提供的各种Filter的 ... -
Spring Security3源码分析-RequestCacheAwareFilter分析
2012-05-09 12:55 5014RequestCacheAwareFilter过滤器对应的类路 ... -
Spring Security3源码分析-ExceptionTranslationFilter分析
2012-05-09 10:03 7924ExceptionTranslationFilter过滤器对应 ... -
Spring Security3源码分析-SessionManagementFilter分析-下
2012-05-08 21:03 6420很多spring security3资料在 ... -
Spring Security3源码分析-SessionManagementFilter分析-上
2012-05-08 17:26 11008SessionManagementFilter过滤 ... -
Spring Security3源码分析-AnonymousAuthenticationFilter分析
2012-05-08 10:32 5292AnonymousAuthenticationFilter ... -
Spring Security3源码分析-BasicAuthenticationFilter分析
2012-05-08 09:24 9693BasicAuthenticationFilter过滤器对应的 ... -
Spring Security3源码分析-FilterSecurityInterceptor分析
2012-05-07 17:31 15384FilterSecurityInterceptor过滤器对应的 ... -
Spring Security3源码分析-SecurityContextHolderAwareRequestFilter分析
2012-05-07 10:34 6889SecurityContextHolderAwareReque ... -
Spring Security3源码分析-RememberMeAuthenticationFilter分析
2012-05-06 22:33 6020RememberMeAuthenticationFilter过 ... -
Spring Security3源码分析-UsernamePasswordAuthenticationFilter分析
2012-05-06 11:54 24940UsernamePasswordAuthenticationF ... -
Spring Security3源码分析-LogoutFilter分析
2012-05-06 10:18 10449LogoutFilter过滤器对应的类路径为 org.spri ... -
Spring Security3源码分析-SecurityContextPersistenceFilter分析
2012-05-06 08:22 8845通过观察Filter的名字,就能大概猜出来这个过滤器的作用,是 ... -
Spring Security3源码分析-FilterChainProxy执行过程分析
2012-05-06 07:48 4312通过FilterChainProxy的初始化、自定义标签的分析 ... -
Spring Security3源码分析-authentication-manager标签解析
2012-05-05 16:13 21768讲解完http标签的解析过程,authentication-m ... -
Spring Security3源码分析-http标签解析
2012-05-05 15:29 8591在FilterChainProxy初始化的 ... -
Spring Security3源码分析-FilterChainProxy初始化
2012-05-04 16:57 20139很久没有更新博客了,最近对Spring Security做了比 ...
相关推荐
### Spring Security 源码分析知识...以上内容涵盖了 Spring Security 3 的源码分析中几个关键点的具体内容。通过对这些内容的深入学习和理解,可以更好地掌握 Spring Security 的工作原理及其在实际项目中的应用技巧。
至于标签 "源码" 和 "工具",这暗示了可能在研究或分析 Spring Security 和 CAS 的内部实现,或者在开发自定义的工具来辅助集成过程。`AutowiringSchedulerFactoryBean.java` 文件可能是一个 Spring 配置文件,用于...
4. **源码分析**: 通过源码可以深入了解Spring Security的工作流程,例如: - 查看`AbstractAuthenticationProcessingFilter`,了解如何处理登录请求。 - 分析`FilterSecurityInterceptor`,理解授权过程中的...
**四、源码分析** 为了深入了解SSO的实现,你可以研究CAS服务器和Spring Security的源码。例如,CAS的`TicketGrantingTicket`是如何创建和存储的,Spring Security的`CasAuthenticationFilter`如何处理SSO的逻辑。 ...
- 虽然源码主要基于Java,但CAS支持与其他语言和框架的集成,如Spring Security、Apache Shiro等,使其能够广泛应用于各种环境。 7. **监控和管理**: - CAS提供了管理界面,管理员可以查看登录日志,监控系统...
7. **源码分析**:源码包允许开发者深入研究Spring Security的实现细节,了解其内部的工作流程,这对于自定义扩展和调试是非常有价值的。例如,可以通过阅读`AuthenticationManager`和`UserDetailsService`的实现来...
源码分析 对于深入理解Spring Security的工作原理,查看源码是很有帮助的。3.2.x版本的源码中,你可以找到`FilterSecurityInterceptor`是如何与`AccessDecisionManager`协作来决定是否允许访问请求的,以及`...
最后,为了调试和理解Spring Security的工作原理,查看官方文档、博客文章(如给定的[博文链接](https://zhoualine.iteye.com/blog/1754626))以及相关的源码分析是非常有帮助的。在实际开发中,不断学习和实践,...
3. 源码分析: - **核心组件**:包括Ticket Granting Ticket(TGT)和Service Ticket,是实现SSO的关键。TGT是用户首次登录时获得的,Service Ticket用于服务提供商验证用户身份。 - **过滤器链**:`CasFilter`是...
例如,Apache Tomcat可以作为CAS服务器的容器,而Spring Security框架则提供了与CAS集成的支持。此外,CAS还支持多种协议扩展,如SAML、OAuth、OpenID Connect等,以适应不同场景的需求。 **总结** CAS单点登录协议...
4. **安全配置**:`cas-server-webapp`中的Spring Security配置,定义了安全规则和权限控制。 开发者可以基于这些源代码学习和自定义SSO流程,例如: 1. 自定义认证策略:扩展`AuthenticationHandler`,实现自己的...
通过对 CAS-5.2.0 的源码学习,开发者不仅可以深入理解 SSO 的工作原理,还能掌握如何定制 CAS 以满足特定的需求,比如扩展认证源、实现自定义登录界面、集成其他服务等。这将有助于提升开发者的技能水平,使其在...
"cas-client-core-3_asleepb5x_CAS_源码.zip"是一个包含CAS客户端核心库的源码压缩包,版本号为3.x。这个压缩包对于理解CAS客户端的工作原理和进行二次开发非常有帮助。 CAS客户端的核心功能在于提供与CAS服务器的...
- **安全组件**:如Spring Security,提供安全控制,防止XSS、CSRF等攻击。 - **数据库交互**:可能包含JDBC或ORM框架如Hibernate,用于用户账户和票证的持久化。 通过这个实例源码,开发者可以了解SSO系统的设计...
3. 源码分析,揭示CAS的内部机制,如票据(ticket)的生成和验证。 4. 如何配置和使用CAS服务器,包括设置认证和授权策略。 5. CAS的凭证管理,包括不同类型的凭证提供者(如数据库、LDAP等)和如何配置它们。 6. ...
### 源码分析 提供的源码可能包含了以上配置的实现,以及一个简单的Java Web应用示例,用于展示如何在实际项目中整合SSO。通过阅读和理解这些源码,你可以更好地掌握SSO的Java实现。 总结来说,SSO通过中央认证...