- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用纯 Spring Java Config 我在让 Spring 和 CAS 执行单点注销时遇到了麻烦。我使用以下配置进行单点登录。我使用一个简单的 JSP 页面对 url https://nginx.shane.com/app/logout 执行表单 POST我在 POST 数据中包含 CSRF 值。这一切似乎都没有错误,但是当我转到安全页面时,它只会让我重新进入而无需登录。有任何想法吗?
@Configuration
@EnableWebSecurity
public class SecurityWebAppConfig extends WebSecurityConfigurerAdapter {
@Bean
protected ServiceProperties serviceProperties() {
ServiceProperties serviceProperties = new ServiceProperties();
serviceProperties.setService("https://nginx.shane.com/app/j_spring_cas_security_check");
serviceProperties.setSendRenew(false);
return serviceProperties;
}
@Bean
public CasAuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
casAuthenticationProvider.setAuthenticationUserDetailsService(authenticationUserDetailsService());
casAuthenticationProvider.setServiceProperties(serviceProperties());
casAuthenticationProvider.setTicketValidator(cas20ServiceTicketValidator());
casAuthenticationProvider.setKey("an_id_for_this_auth_provider_only");
return casAuthenticationProvider;
}
@Bean
public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> authenticationUserDetailsService() {
return new TestCasAuthenticationUserDetailsService();
}
@Bean
public Cas20ServiceTicketValidator cas20ServiceTicketValidator() {
return new Cas20ServiceTicketValidator("https://nginx.shane.com/cas");
}
@Bean
public CasAuthenticationFilter casAuthenticationFilter() throws Exception {
CasAuthenticationFilter casAuthenticationFilter = new CasAuthenticationFilter();
casAuthenticationFilter.setAuthenticationManager(authenticationManager());
return casAuthenticationFilter;
}
@Bean
public CasAuthenticationEntryPoint casAuthenticationEntryPoint() {
CasAuthenticationEntryPoint casAuthenticationEntryPoint = new CasAuthenticationEntryPoint();
casAuthenticationEntryPoint.setLoginUrl("https://nginx.shane.com/cas/login");
casAuthenticationEntryPoint.setServiceProperties(serviceProperties());
return casAuthenticationEntryPoint;
}
@Bean
public SingleSignOutFilter singleSignOutFilter() {
// This filter handles a Single Logout Request from the CAS Server
return new SingleSignOutFilter();
}
@Bean
public LogoutFilter requestLogoutFilter() {
// This filter redirects to the CAS Server to signal Single Logout should be performed
SecurityContextLogoutHandler handler = new SecurityContextLogoutHandler();
handler.setClearAuthentication(true);
handler.setInvalidateHttpSession(true);
LogoutFilter logoutFilter = new LogoutFilter("https://nginx.shane.com/", handler);
return logoutFilter;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(casAuthenticationFilter());
http.addFilterBefore(requestLogoutFilter(), LogoutFilter.class);
http.addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class);
http.exceptionHandling()
.authenticationEntryPoint(casAuthenticationEntryPoint());
http.authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')");
http.logout()
.addLogoutHandler(handler)
.deleteCookies("remove")
.invalidateHttpSession(true)
.logoutUrl("/logout")
.logoutSuccessUrl("/");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(casAuthenticationProvider());
}
@WebListener
public class SecurityWebListener implements HttpSessionListener {
private SingleSignOutHttpSessionListener listener = new SingleSignOutHttpSessionListener();
@Override
public void sessionCreated(HttpSessionEvent se) {
listener.sessionCreated(se);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
listener.sessionDestroyed(se);
}
}
[org.springframework.security.web.FilterChainProxy] [/logout at position 6 of 14 in additional filter chain; firing Filter: 'LogoutFilter'] []
[org.springframework.security.web.util.matcher.AntPathRequestMatcher] [Checking match of request : '/logout'; against '/logout'] []
[org.springframework.security.web.authentication.logout.LogoutFilter] [Logging out user 'org.springframework.security.cas.authentication.CasAuthenticationToken@836ad34b: Principal: org.springframework.security.core.userdetails.User@586034f: Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffdaa08: RemoteIpAddress: 127.0.0.1; SessionId: FA880C15EF09C033E1CA0C8E4785905F; Granted Authorities: ROLE_ADMIN Assertion: org.jasig.cas.client.validation.AssertionImpl@fcd38ec Credentials (Service/Proxy Ticket): ST-23-1UandqRxBcG6HCTx0Pdd-cas01.example.org' and transferring to logout destination] []
[org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler] [Invalidating session: FA880C15EF09C033E1CA0C8E4785905F] []
[org.jasig.cas.client.session.HashMapBackedSessionMappingStorage] [Attempting to remove Session=[FA880C15EF09C033E1CA0C8E4785905F]] []
[org.jasig.cas.client.session.HashMapBackedSessionMappingStorage] [Found mapping for session. Session Removed.] []
[org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler] [Using default Url: /] []
[org.springframework.security.web.DefaultRedirectStrategy] [Redirecting to '/app/'] []
最佳答案
(不)幸运的是我遇到了类似的问题;)当 CAS 尝试调用您的应用程序以注销时会发生这种情况。一方面 CAS 尝试通过 sessionId 来执行注销,另一方面 SpringSecurity 期望获得 CSRF token ,它不是由 CAS 发送的,因为它只发送 GET 请求。 CsrfFilter 找不到 csrf token 并中断过滤器链。用户不知道这一点,因为 CAS 隐式调用注销请求。请求直接从 CAS 服务器发送到应用程序服务器,而不是通过在 Web 浏览器中重定向用户。
为了使其工作,您需要将 HttpSecurity 配置为排除/不包括 LogoutFilter filterProcessesUrl(在您的情况下为 j_spring_security_logout ,因为您使用默认值)。
假设您想在尝试创建新管理员时检查CSRF,对于insatnce,您需要进行如下配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.addFilter(casAuthenticationFilter());
http.addFilterBefore(requestLogoutFilter(), LogoutFilter.class);
http.addFilterBefore(singleSignOutFilter(), CasAuthenticationFilter.class);
http.exceptionHandling()
.authenticationEntryPoint(casAuthenticationEntryPoint());
http.authorizeRequests()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.antMatchers("/dba/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')");
http.csrf()
.requireCsrfProtectionMatcher(new AntPathRequestMatcher("/admin/create"));
http.logout()
.addLogoutHandler(handler)
.deleteCookies("remove")
.invalidateHttpSession(true)
.logoutUrl("/logout")
.logoutSuccessUrl("/");
}
http.csrf().requireCsrfProtectionMatcher(new AntPathRequestMatcher("/admin/create"));
.
关于spring - 使用 Spring Security 和 CAS 进行单点注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28891653/
我是 SSO 新手,我希望安装 Jasig CAS 演示 Web 应用程序并能够在其中登录。纯粹的研究和测试。我已经使用 https://wiki.jasig.org/display/CASUM/Se
我还没有找到任何人使用 Python 来通过 CAS 的例子。希望 Kenneth Reitz 可以向我展示“请求”如何让这一切变得简单...... 基本上,我无法通过 CAS 登录...从不验证我的
我正在尝试为一个开源项目编写一个 CAS ( https://en.wikipedia.org/wiki/Central_Authentication_Service) 客户端(使用 phpCAS),
我在本地计算机上建立了一个独立的 CAS 5 实例,用于修补/黑客攻击,并尝试将其设置为独立的 WAR 文件,并通过简单的基于文件的身份验证部署到 Tomcat。 从 WAR Overlay 模板 (
请解释一下 Shibboleth 和 CAS 之间的区别是什么? 最佳答案 第一个 (Shibboleth) 是服务器,第二个 (CAS) 是协议(protocol)。比较Central Authen
CAS(中央身份验证服务)和 Keycloak(身份和访问管理)之间有什么区别? 最佳答案 CAS 不支持 OAuth2,但 Keycloak 支持。这是一个很大的区别。 关于cas - CAS 和
我已使用 Spring 配置 CAS 以进行 SSO。然后我注意到,对于每个请求,CAS 客户端即使在第一次登录后也会联系 CAS 服务器。这正常吗? 这些是服务器操作: 身份验证期间: ACTION
遵循官方 Apereo CAS 文档。我无法理解(经过各种研究和指导)。 如何恢复认证后刚刚登录的用户。项目之间的身份验证和 SSO 正常工作。但是我无法获取有关已登录用户的信息。 这是我在 Appl
我正在将 CAS 与 JDBC 身份验证处理程序一起使用,并且想知道是否有可能在成功身份验证后获取主体对象的其他属性(例如名字、姓氏)而不仅仅是来自 CAS 的用户名? 最佳答案 在 casServi
我们正在开发一个邮件系统,其邮件客户端是Roundcube,使用Zimbra 作为邮件服务器。我的任务是将它们与 CAS 服务器集成,使它们能够单点登录。经过几天的研究,我觉得这是不可能的。 那么如何
我们正在尝试将 CAS 服务器用于我们现有的基于 Web 的应用程序的 SSO。我们的目标是 跨各种应用(包括跨域)实现单点登录。 在重定向到 CAS 服务器登录页面时,为不同的应用程序定制登录(在
我正在尝试使用 CAS 作为我的组织的 SSO 解决方案。使用此解决方案的应用程序之一是 GWT 应用程序,使用 GWTP 作为其 MVP 平台。 当尝试导航到我的应用程序中的某个内部位置时,例如:
在用户和 CAS 之间有一个负载均衡器。负载均衡器将检查是否允许 SSL 证书。但是从负载均衡器到 CAS 的连接将是 HTTP。 如何配置 cas 使其监听 HTTP? 我已经在我的 cas.pro
我在 CAS 中遇到单点注销问题。我使用的是 CAS 服务器 4.2.3 和 Spring 3.2。我的客户端应用程序是在 Spring Security 上配置的。遵循以下文档:http://doc
我正在考虑为 Django 网站设置单点登录。我的搜索将我带到了 django-mama-cas 和 django-cas-ng 但我不确定我是否可以或应该单独或一起使用它们。 django-cas-
我们使用 CAS 5.0 版和 LDAP 身份验证以及 DUO 多重身份验证。 Cas服务器工作正常。然后我们开始将 CAS SSO 集成到我们的应用程序中,此时我们在 java CAS 客户端中遇到
在过去的 3 天里,我一直在尝试从 4.X 服务器更改为 CAS 5.1.x 服务器,并进行了各种搜索和研究,但几乎没有任何进展。每当我删除对 cas-server-webapp-tomcat 的依赖
LDAP 与 MYSQL..JA-SIG CAS 使用 LDAP 与 CAS 使用 MySQL。 现在我们在 LDAP 中有用户 ID、密码和角色,并且正在与 CAS 和 Spring Secuirt
找不到类错误:org.apereo.cas.services.ServiceRegistry]:工厂方法“jsonServiceRegistry” 抛出异常;嵌套异常是 java.lang.NoCla
已经使用过OpenDJ和OpenAM的人们的经验是什么?旧版本似乎可以免费使用,但新版本似乎不是免费使用。它们与现有的商业产品相比如何?与将OpenLDAP与CAS一起使用相比,它们看起来是更好的选择
我是一名优秀的程序员,十分优秀!