春季安全登录页面?

时间:2010-02-03 21:37:30

标签: java spring java-ee spring-security

我对弹簧安全的工作方式感到困惑:

在我的应用程序中,我需要为用户提供一个登录页面,然后将它们重定向到他们来自的页面。我浏览了一些Spring安全教程并阅读了一些文章,这些示例通过保护站点上的某个页面(由<intercept url ..>标记管理)来工作。然后Spring安全性将生成一个登录页面(或者您可以指定自己的)以访问受保护的页面。

我很困惑,因为我不想在我的网站上确保给定页面的必要安全:我想要一个登录页面供用户登录,之后他们可以访问网站的高级功能(通过spring security的授权功能) 。我的问题是:根据我的描述,创建此登录页面的策略是什么,在登录后,将为登录用户授予适当的权限?

我想到的黑客将是创建一个简单的JSP页面,其唯一的功能是重定向回到上一页。然后我会使用Spring Security来保护JSP页面。但似乎应该有更好的方法来做到这一点......

由于

3 个答案:

答案 0 :(得分:2)

当用户尚未登录时,您可以将其视为ANONYMOUS。因此,该页面将隐藏标有<sec:authorize ifAllGranted="ROLE_SUPERVISOR">的所有内容 有关详细信息,请参阅Anonymous Authentication

答案 1 :(得分:1)

我不知道你是否还需要答案,因为你的问题是在feb。中,但是一旦用户通过SS登录,你就可以在控制器中获得SS Authentication对象:

SecurityContextHolder.getContext().getAuthentication();

我所做的是创建自己的Authentication类并将其包装在Spring的Authentication类中,因此如果我更改了提供程序,我只需使用新的提供程序扩展我的Authentication类。然后我把我的包装器放在会话中,这样我就可以随时通过OGNL查询身份验证对象,我想知道是否有人登录,详情是什么。

即:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth.isAuthenticated()) {
    session.put("authentication", auth);
}

注销,只是使会话无效

session.invalidate();

我也用SS做了一些技巧。由于SS在访问安全域时自动提供表单登录(与j_security_check相同的工作流),因此您可以将登录定义为指向安全域中不存在的页面:

<a href="my_secured_realm/non_existant_page">click here to sign in</a>
然后,SS将启动登录页面。然后,无论您使用何种框架,都可以在登录后拦截以获取Authentication对象。

希望这有帮助。

答案 2 :(得分:0)

您必须设置always-use-default-target="false"以便Spring安全性会自动重定向到上一页,如果设置为true,它将始终显示为默认主页。该属性位于form-login标记。