覆盖shiro未授权页面

时间:2011-10-26 17:43:46

标签: security shiro

我需要知道如何覆盖shiro未经授权的页面。即,当用户对受保护的URL没有一些许可时,shiro返回页面401.我们如何使用户转发到预定义的未授权页面?

...谢谢

3 个答案:

答案 0 :(得分:3)

我发现只有一种方法,如何将重定向更改为login.jsp以响应401。

您应该创建自己的Filter,它将扩展org.apache.shiro.web.filter.authc.FormAuthenticationFilter,并覆盖saveRequestAndRedirectToLogin()方法。

public class SecurityAuthenticationFilter extends FormAuthenticationFilter {

    @Override
    protected void saveRequestAndRedirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
        saveRequest(request);
        sendChallenge(response);
    }

    protected void sendChallenge(ServletResponse response) {
        HttpServletResponse httpResponse = WebUtils.toHttp(response);
        httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    }

}

我使用Guice + Shiro集成。因此,此过滤器的添加方式与org.apache.shiro.guice.web.ShiroWebModule相同。

public class SecurityModule extends ShiroWebModule {

    public static final Key<SecurityAuthenticationFilter> AUTHC_REST = Key.get(SecurityAuthenticationFilter.class);

    ...

    @Override
    protected void configureShiroWeb() {
        ...

        // Add as filter
        addFilterChain("/rest/login", ANON);
        addFilterChain("/rest/**", AUTHC_REST);

        ...
    }
}

对于shiro.ini文件,应按以下方式添加:

[main]
authc = package.path.to.SecurityAuthenticationFilter

[urls]
/rest/login = anon
/rest/** = authc

这应该有效:)

答案 1 :(得分:0)

:)我需要反过来,我想获得401而不是重定向(302)。你目前的设置是什么?你能从shiro.ini文件配置吗?

答案 2 :(得分:0)

不确定您正在使用哪个技术堆栈,但在Java Web应用程序中,您可以在标记内的web.xml中对其进行配置。

<error-page>
  <error-code>401</error-code>
  <location>{path to custom page}</location>
</error-page>