1

我写在这里是因为我找不到我的问题的明确答案:

我的项目正在使用 Spring MVC 和 Spring Security。我为 Web 应用程序(当然使用 Java)很好地安装了两者。我可以使用 post 和 get 方法访问,但只有在用户通过 Spring Security 的通常形式连接之后。

从现在开始,用户对这样的地址发出请求:

../../get.request?request=getListCommand

其中 get.request 是 Spring MVC 的映射。只有在用户通过身份验证后才能启用此访问权限!

我需要做的: 添加直接访问此请求的可能性,而无需先前已通过身份验证,例如使用这样的地址:

http://123.123.123.123:123/get.request?request=getListCommand&j_password=myPassword&j_username=myName

或者

same thing with the post protocol and the params given (request=getListCommand, j_password=myPassword, j_username=myName)

当然,必须在执行请求并将结果发回之前完成身份验证。

我在许多网站上搜索或直接在 Spring 安全网站上搜索。他们谈论过滤器链、自己的用户名认证、RMI;但我并没有真正找到一个完整的例子来做我上面介绍的事情。

感谢任何可以帮助我的人。

ps:我使用所有默认或最简单的Spring安全配置(没有风水'风格:-))

这是我的安全上下文 xml 文件

<http realm="NexCap Up"
        auto-config="true"
        access-denied-page="/www/jsp/authentication/accessDenied.jsp"
        create-session="always"
        disable-url-rewriting="true">          
            <port-mappings>
                <port-mapping http="8084" https="8443"/>
            </port-mappings>        

            <intercept-url pattern="/www/jsp/authentication/connexion.jsp"                    
                access='IS_AUTHENTICATED_ANONYMOUSLY' requires-channel="https"/>

            <intercept-url pattern="/www/jsp/authentication/connexionFailed.jsp" 
                access='IS_AUTHENTICATED_ANONYMOUSLY'  />

            <intercept-url pattern="/www/jsp/authentication/applicationExit.jsp" 
                access='IS_AUTHENTICATED_ANONYMOUSLY'  /> 


          <intercept-url 
                pattern="/get.Request" 
                method="GET"
                access="ROLE_REMOTE" />

             <intercept-url 
                pattern="/post.Request"  
                method="POST"
                access="ROLE_REMOTE" />

            <intercept-url pattern="/**" 
                access="ROLE_REMOTE,ROLE_SCRIPT"  />
       <form-login 
            authentication-failure-url="/www/jsp/authentication/connexionFailed.jsp"
            login-page="/www/jsp/authentication/connexion.jsp"
            default-target-url="/www/jsp/index.jsp"
            always-use-default-target="true"/>

        <logout
            logout-success-url="/www/jsp/authentication/applicationExit.jsp"
            invalidate-session="true"/>

        <session-management
            invalid-session-url="/www/jsp/authentication/invalidSession.jsp"
            session-authentication-error-url = "/www/jsp/authentication/authentificationError.jsp"
            session-fixation-protection="none">

            <!-- Sessions concurrentes -->
            <concurrency-control 
                error-if-maximum-exceeded="false"
                expired-url="/www/jsp/authentication/sessionExpired.jsp"
                max-sessions="1" />

        </session-management>

    </http>

以及关于spring security的web.xml文件部分

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Security</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>


<filter>
  <display-name>springSecurityFilterChain</display-name>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>
      org.springframework.web.filter.DelegatingFilterProxy
  </filter-class>

<filter-mapping>
   <filter-name>springSecurityFilterChain</filter-name>
   <url-pattern>/*</url-pattern>

<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
       /WEB-INF/spring/secu-config.xml
   </param-value>

4

1 回答 1

0

假设applicationContext-security.xml你的WEB-INF中有一个。
如果您可以发布您的 applicationContext-security.xml
并且您几乎拥有 Spring Security 的默认配置,那就太好了。

我会推荐以下。

首先将您的网址更改为/public/get.request?request=getListCommand

然后将以下代码段添加到 applicationContext-security.xml

<http use-expressions="true">
 <intercept-url pattern="/public/**" access="permitAll" />
 <!-- You can add n number of filters here-->
</http>

它将做的是绕过/public/. 更改 URL 的原因是您可能不希望整个应用程序公开。

下面是我的 XML 示例。
另请注意,我的身份验证提供程序是自定义的,所以不要混淆。您只需要查看我的<http>部分,您就会了解如何在您的应用程序中实现。

<?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.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <global-method-security pre-post-annotations="enabled" jsr250-annotations="enabled" secured-annotations="enabled">
        <!-- AspectJ pointcut expression that locates our "post" method and applies security that way
        <protect-pointcut expression="execution(* bigbank.*Service.post*(..))" access="ROLE_TELLER"/>
        -->
    </global-method-security>

    <http use-expressions="true">
        <intercept-url pattern="/favicon.ico" access="permitAll" />
        <intercept-url pattern="/static/**" access="permitAll"/>
        <intercept-url pattern="/login.jsp*" access="permitAll"/>
        <intercept-url pattern="/Admin/**" access="hasAnyRole('ROLE_SUPER_USER')"/>
        <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1" />
        <http-basic/>
        <logout logout-success-url="/login.jsp"/>
        <remember-me user-service-ref="loginService" />
        <!-- Uncomment to limit the number of sessions a user can have -->
     </http>

    <authentication-manager>
        <authentication-provider user-service-ref="loginService">
         <password-encoder hash="md5"/>
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="loginService" class="com.indyaah.service.LoginService">
    </beans:bean>
    <beans:bean id="authService" class="com.indyaah.service.AuthService" />
</beans:beans>

如您所见login.jsp,我允许匿名访问我的静态内容(images/js/css/etc.),这意味着无需登录。

希望这有帮助。

如果您在理解方面需要进一步的帮助,请告诉我。

于 2012-10-11T13:43:40.037 回答