jsf spring安全访问被拒绝认证登录

Posted

技术标签:

【中文标题】jsf spring安全访问被拒绝认证登录【英文标题】:jsf spring security acces denied authentication login 【发布时间】:2012-02-14 15:46:47 【问题描述】:

我在我的 jsf2 Web 应用程序中使用 Spring Security 3。

当未经身份验证的用户尝试访问受保护的资源时,Spring Security 会重定向到登录页面。

在这种情况下,如何在登录页面中向用户显示一条消息,说他/她不允许访问该资源?

由于 Spring Security 在 ExceptionTranslationFilter 中引发 AccessDeniedException,然后重定向到登录页面,我尝试在登录页面中使用 preRenderView 侦听器,该侦听器检查“WebAttributes.ACCESS_DENIED_403”,但它为空。

【问题讨论】:

【参考方案1】:

看起来像这里提到的重复问题。 link

如前所述,创建一个实例 AccessDeniedHandlerImpl 并将其属性设置为您的自定义错误页面。从该页面使用简单的 javascript 转发到实际的登录页面,例如

 <script language="javascript" type="text/javascript">
 window.setTimeout('window.location="http://localhost:8080/WebApp/login.xhtml"; ',5000);
 </script>

或者只是提供一个按钮或登录页面的链接。

【讨论】:

我的情况不是这样。我的情况是用户尚未通过身份验证,这就是他被发送到登录页面的原因。这不是用户通过身份验证时发送的拒绝访问页面,但他没有允许的角色。 如果用户尚未通过身份验证,spring security 将始终将用户发送到登录页面,并且在身份验证后,如果用户无权访问所请求的资源,则会显示拒绝访问页面。我假设您不希望 Web 应用程序服务器发送默认的拒绝访问页面。见下文 我知道未经身份验证的用户被重定向到登录页面。我想要的是在该登录页面中向用户显示一条消息。这就是我在问题中提出的问题【参考方案2】:

现在我明白了,实际上,如果用户尚未通过身份验证,则会引发 AuthenticationException 并且 ExceptionTranslationFilter 将启动 authenticationEntryPoint。所以只需像这样添加错误请求参数。

<bean id="exceptionTranslationFilter"
 class="org.springframework.security.web.access.ExceptionTranslationFilter">
 <property name="authenticationEntryPoint" ref="authenticationEntryPoint"/>
</bean>

<bean id="authenticationEntryPoint"
 class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
 <property name="loginFormUrl" value="/login.xhtml?error=true"/>
</bean>

and in your login.xhtml use the param like this

<h:outputText rendered="#param['error']" value="Please authenticate first!" />

【讨论】:

Spring Security 标签库用于根据经过身份验证的用户是否具有特定角色来渲染组件,即它处理授权。但是我的情况与授权无关,而是与身份验证有关。更重要的是,在我的应用程序中,我没有用户角色。我只想在登录页面中显示一条消息,因为他试图访问需要身份验证的页面,因此将未经过身份验证的用户重定向到该页面。 谢谢@Ravi。最后我发现这是正确的解决方案。有用。我将 ?error=true 附加到 loginFormUrl,然后在登录页面的 preRenderView 侦听器中检查它,以便向用户显示消息。【参考方案3】:

将此添加到您的 web.xml

    <error-page>
       <error-code>403</error-code>
       <location>/pages/errorAccessDenied.xhtml</location>
    </error-page>

然后使用您的消息创建一个 errorAccessDenied.xhtml。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html">

<h:head>
</h:head>
<h:body>
     <h:outputText value="You do not have access to the requested resource" />
</h:body>
</html>

【讨论】:

如果您有指向其他资源的标题链接,用户可以轻松导航到允许访问的其他页面。

以上是关于jsf spring安全访问被拒绝认证登录的主要内容,如果未能解决你的问题,请参考以下文章

Spring安全登录错误页面,访问被拒绝

访问被拒绝 - 使用认证机制PLAIN RabbitMQ Queue拒绝登录

在 Spring Security 中启用 CSRF 时,访问被拒绝 403

jsf spring安全用户信息

登录不了高德地图显示访问被拒绝使用代理权限

微小宝上传照片显示没有权限访问目标请求