Java Spring安全性和从另一个站点登录而无需重新输入凭据
正如这篇文章的标题所说,我正在将Spring安全性集成到我已经在工作的Spring MVC web应用程序中,我需要其他网站的用户可以打开从该网站到我的网站的链接并已经登录,而无需重新输入用户名和密码,也无需让其他网站的开发人员更改太多内容。用户总是先登录到另一个站点,然后再登录到我的站点,但决不会反过来。 这两个web应用程序都供一家公司内部使用,没有任何外部网络可以访问托管服务器,两个站点可以访问同一个用户数据库。 尽管这个场景非常安全(不是公共网站),但我需要尽可能安全的解决方案。 在搜索了一段时间后,我看到了几种方法:Java Spring安全性和从另一个站点登录而无需重新输入凭据,java,spring-mvc,spring-security,Java,Spring Mvc,Spring Security,正如这篇文章的标题所说,我正在将Spring安全性集成到我已经在工作的Spring MVC web应用程序中,我需要其他网站的用户可以打开从该网站到我的网站的链接并已经登录,而无需重新输入用户名和密码,也无需让其他网站的开发人员更改太多内容。用户总是先登录到另一个站点,然后再登录到我的站点,但决不会反过来。 这两个web应用程序都供一家公司内部使用,没有任何外部网络可以访问托管服务器,两个站点可以访问同一个用户数据库。 尽管这个场景非常安全(不是公共网站),但我需要尽可能安全的解决方案。 在搜索
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<session-config>
<session-timeout>
1
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
<!-- Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
上下文配置位置
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml
org.springframework.web.context.ContextLoaderListener
调度员
org.springframework.web.servlet.DispatcherServlet
1.
调度员
/
log4jConfigLocation
/WEB-INF/log4j.properties
org.springframework.web.util.Log4jConfigListener
1.
redirect.jsp
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
applicationContext-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<!-- This is where we configure Spring-Security -->
<http use-expressions="true">
<intercept-url pattern="/ShowDocuments" access="permitAll"/>
<intercept-url pattern="/AddDocForm" access="hasRole('ROLE_ADMIN')"/>
<access-denied-handler error-page="/AccessDenied"/>
<http-basic/>
<session-management>
<concurrency-control expired-url="/sessionExpired.html"/>
</session-management>
</http>
<authentication-manager></authentication-manager>
</beans:beans>
如您所见,AddDocForm仅可供管理员用户访问。为了测试所有这些是否都有效,我需要某种方法来强制安全上下文对任何用户进行身份验证。这是我使用的java代码:
public boolean loginUser() {
boolean success = true;
List<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("ROLE_USER");
UserDetails userDetails = new User(usuario.getLogin(), "undefined", authorities);
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
return success;
}//END_METHOD
公共布尔登录用户(){
布尔成功=真;
列表权限=AuthorityUtils.createAuthorityList(“角色用户”);
UserDetails UserDetails=新用户(usuario.getLogin(),“未定义”,权限);
Authentication Authentication=new UsernamePasswordAuthenticationToken(userDetails,userDetails.getPassword(),userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(身份验证);
回归成功;
}//端点法
此方法将使用权限角色\ u user对一个用户进行身份验证。因此,不应允许访问AddDocForm。这是我遵循的程序:
行代码以避免这种情况,但一直在发生
有人对此有什么线索吗?看看这个问题的答案是否能给你指明方向。选项1似乎更容易,尽管我没有这样做。CAS不要求用户重新输入凭据真的吗?CAS的所有示例和教程都显示了一个新的登录表单。你知道任何在线教程解释这一点吗?或者,你可以给我一个快速的描述,说明实现这个目标需要遵循哪些步骤。有人能帮我解决上一个问题吗(在解决了主要问题之后)?请看上面编辑的帖子。