Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring安全性和从另一个站点登录而无需重新输入凭据_Java_Spring Mvc_Spring Security - Fatal编程技术网

Java Spring安全性和从另一个站点登录而无需重新输入凭据

Java Spring安全性和从另一个站点登录而无需重新输入凭据,java,spring-mvc,spring-security,Java,Spring Mvc,Spring Security,正如这篇文章的标题所说,我正在将Spring安全性集成到我已经在工作的Spring MVC web应用程序中,我需要其他网站的用户可以打开从该网站到我的网站的链接并已经登录,而无需重新输入用户名和密码,也无需让其他网站的开发人员更改太多内容。用户总是先登录到另一个站点,然后再登录到我的站点,但决不会反过来。 这两个web应用程序都供一家公司内部使用,没有任何外部网络可以访问托管服务器,两个站点可以访问同一个用户数据库。 尽管这个场景非常安全(不是公共网站),但我需要尽可能安全的解决方案。 在搜索

正如这篇文章的标题所说,我正在将Spring安全性集成到我已经在工作的Spring MVC web应用程序中,我需要其他网站的用户可以打开从该网站到我的网站的链接并已经登录,而无需重新输入用户名和密码,也无需让其他网站的开发人员更改太多内容。用户总是先登录到另一个站点,然后再登录到我的站点,但决不会反过来。 这两个web应用程序都供一家公司内部使用,没有任何外部网络可以访问托管服务器,两个站点可以访问同一个用户数据库。 尽管这个场景非常安全(不是公共网站),但我需要尽可能安全的解决方案。 在搜索了一段时间后,我看到了几种方法:

  • 单点登录解决方案,被提及最多的是CAS。但是,到目前为止,我看到的所有示例都要求用户重新输入凭据,这是我想要避免的
  • 在涉及web服务的三步握手过程中使用令牌生成器,如本文所述
  • 加密用户和密码凭据,并通过URL本身发送它们
  • 正如我告诉你的,考虑到上述解释,我需要最安全、最简单的方法来实现这一点。 我还希望能收到一些关于该解决方案的代码(主要是SpringSecurity和services/java类中的bean配置来处理这个问题)

    谢谢

    编辑: 我找到了一种不同且更简单的方法来解决我的特殊情况。用户登录的主网页可以重定向到mine,执行POST请求,该请求应包含一个参数“login”。然后我只需要获取这个参数并强制在安全上下文中对该用户进行身份验证。我会发布代码,但我仍然有一个问题,请继续阅读直到最后:

    Web.xml

    <?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。这是我遵循的程序:

  • 我加载主页,就好像它是从另一个站点加载的一样
  • 处理此操作的控制器在加载主页面之前执行角色\用户身份验证
  • 从那里我尝试访问AddDocForm和。。。。是,将显示AccessDenied页面
  • 但是,每当用户的会话过期时(或者至少我认为是这样),我的Firefox浏览器就会弹出一个凭据弹出窗口,如下所示:

    由于我不希望这种情况发生,我添加了
    行代码以避免这种情况,但一直在发生


    有人对此有什么线索吗?

    看看这个问题的答案是否能给你指明方向。选项1似乎更容易,尽管我没有这样做。CAS不要求用户重新输入凭据真的吗?CAS的所有示例和教程都显示了一个新的登录表单。你知道任何在线教程解释这一点吗?或者,你可以给我一个快速的描述,说明实现这个目标需要遵循哪些步骤。有人能帮我解决上一个问题吗(在解决了主要问题之后)?请看上面编辑的帖子。