gpt4 book ai didi

java - Spring Security 从远程访问访问请求,无需预先身份验证

转载 作者:行者123 更新时间:2023-12-01 05:05:02 25 4
gpt4 key购买 nike

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

我的项目正在使用 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

与 post 协议(protocol)和给定的参数相同(request=getListCommand、j_password=myPassword、j_username=myName)

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

我在很多网站上进行了搜索,或者直接在Spring security网站上进行了搜索。他们谈论过滤链、自己的用户名身份验证、RMI;但我并没有真正找到执行上面介绍的完整示例。

感谢任何能够以这种方式帮助我的人。

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

这是我的安全上下文 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>

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

<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>

最佳答案

假设有一个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)可以匿名访问,这意味着无需登录。

希望这有帮助。

如果您需要进一步的帮助来理解。

关于java - Spring Security 从远程访问访问请求,无需预先身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12838607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com