gpt4 book ai didi

java - Spring 3 安全 : AccessDeniedHandler is not being invoked

转载 作者:太空狗 更新时间:2023-10-29 22:45:09 25 4
gpt4 key购买 nike

我有一个 spring 3 应用程序,其配置如下。当任何用户尝试访问页面但他/她未登录时,我会收到一个Access is Denied 异常以及丑陋的堆栈跟踪。我如何处理此异常而不让它转储堆栈跟踪。我实现了自己的拒绝访问处理程序,但没有被调用。

根据所请求资源的类型,我想显示自定义错误消息或页面。这是我的 Spring 配置。

如何让 Spring 调用我的 access-denied-handler 。这是我的 Spring 配置

 <security:http auto-config='true'>
<security:intercept-url pattern="/static/**" filters="none"/>
<security:intercept-url pattern="/login" filters="none"/>

<security:intercept-url pattern="/**" access="ROLE_USER" />

<security:form-login login-page="/index"
default-target-url="/home" always-use-default-target="true"
authentication-success-handler-ref="AuthenticationSuccessHandler"
login-processing-url="/j_spring_security_check"
authentication-failure-url="/index?error=true"/>

<security:remember-me key="myLongSecretCookieKey" token-validity-seconds="1296000"
data-source-ref="jdbcDataSource" user-service-ref="AppUserDetailsService" />

<security:access-denied-handler ref="myAccessDeniedHandler" />

</security:http>

<bean id="myAccessDeniedHandler"
class="web.exceptions.handlers.AccessDeniedExceptionHandler">
<property name="errorPage" value="/public/403.htm" />
</bean>

下面给出了处理这个异常的自定义类

public class AccessDeniedExceptionHandler implements AccessDeniedHandler
{

private String errorPage;

@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException arg2) throws IOException, ServletException {
response.sendRedirect(errorPage);
}

public void setErrorPage(String errorPage) {
if ((errorPage != null) && !errorPage.startsWith("/")) {
throw new IllegalArgumentException("errorPage must begin with '/'");
}
this.errorPage = errorPage;
}

}

当我运行这个应用程序时,这是我得到的错误。我只粘贴了堆栈跟踪和 Spring 调试日志的一部分。

20:39:46,173 DEBUG AffirmativeBased:53 - Voter: org.springframework.security.access.vote.RoleVoter@5b7da0d1, returned: -1
20:39:46,173 DEBUG AffirmativeBased:53 - Voter: org.springframework.security.access.vote.AuthenticatedVoter@14c92844, returned: 0
20:39:46,178 DEBUG ExceptionTranslationFilter:154 - Access is denied (user is anonymous); redirecting to authentication entry point
org.springframework.security.access.AccessDeniedException: Access is denied
at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:71)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:204)

如何解决这个问题?首先,我想阻止 spring 抛出该异常。如果它仍然抛出它,我想处理它而不是举起任何旗帜。

更新:我也附上了我的 web.xml 的一部分。

<!-- Hibernate filter configuration -->

<filter>
<filter-name>HibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

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

<!--Dispatcher Servlet -->

<servlet>
<servlet-name>rowz</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

最佳答案

在您的配置中,您要求用户在您网站上输入任何 URL 时始终进行身份验证:

<security:intercept-url pattern="/**" access="ROLE_USER" />

我认为您应该允许用户在进入登录页面未验证:

<security:intercept-url pattern="/your-login-page-url" access="ROLE_ANONYMOUS" />
<security:intercept-url pattern="/your-login-process-url" access="ROLE_ANONYMOUS" />
<security:intercept-url pattern="/your-login-failure-url" access="ROLE_ANONYMOUS" />
<security:intercept-url pattern="/**" access="ROLE_USER" />

如果您使用类似 URL:/login/start , /login/error/login/failure你可以拥有:

<security:intercept-url pattern="/login/**" access="ROLE_ANONYMOUS" />
<security:intercept-url pattern="/**" access="ROLE_USER" />

更新:

具有此配置应该使框架将所有未经身份验证(匿名)的用户重定向到登录页面,并将所有经过身份验证的用户重定向到 AccessDeniedHandler . AccessDeniedException是框架的核心部分之一,忽略它不是一个好主意。如果您只提供部分 Spring Security 配置,则很难提供更多帮助。

请务必阅读 ExceptionTranslationFilter 的 JavaDoc详细解释框架抛出哪些异常,默认情况下为什么以及如何处理。

如果可能,请尝试删除您添加的尽可能多的自定义部件,例如 AuthenticationSuccessHandler , RememberMeAuthenticationFilterAccessDeniedHandler看看问题是否仍然存在?尝试获得最少的配置并逐步添加新功能以查看错误的来源。

您在问题中没有提及的一件重要事情是此错误消息的结果是什么?你有没有HTTP 500 ?或者 HTTP 403 ?还是您会被重定向到登录页面?

如果正如您在问题中提到的那样,用户未经身份验证并且他/她被重定向到登录页面,那么这就是它的预期工作方式。看起来您收到了 ExceptionTranslationFilter:172 记录的错误消息只因为你有 DEBUG级别设置为 Spring Security 类。如果是这样,那么这也是它的工作方式,如果您不想记录错误,那么只需提高 Spring Secyruty 类的日志记录级别。

更新 2:

filters="none" 的模式必须匹配 login-page , login-processing-urlauthentication-failure-ur <security:form-login /> 中设置的属性跳过显示登录页面的页面上的所有 SpringSecurity 检查并处理登录。

<security:http auto-config='true'>
<security:intercept-url pattern="/static/**" filters="none"/>
<security:intercept-url pattern="/index" filters="none"/>
<security:intercept-url pattern="/j_spring_security_check" filters="none"/>
<security:intercept-url pattern="/**" access="ROLE_USER" />

<security:form-login login-page="/index"
default-target-url="/home" always-use-default-target="true"
authentication-success-handler-ref="AuthenticationSuccessHandler"
login-processing-url="/j_spring_security_check"
authentication-failure-url="/index?error=true"/>

<security:remember-me key="myLongSecretCookieKey" token-validity-seconds="1296000"
data-source-ref="jdbcDataSource" user-service-ref="AppUserDetailsService" />

<security:access-denied-handler ref="myAccessDeniedHandler" />

</security:http>

关于java - Spring 3 安全 : AccessDeniedHandler is not being invoked,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013197/

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