2010-02-03 152 views
0

我对弹簧安全性如何工作有些困惑:春季安全登录页面?

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

我很困惑,因为我不想在我的网站上安全的给定一个页面:我想要一个登录页面让用户登录后才能访问该站点的高级功能(通过Spring安全性的授权功能)。我的问题是:根据我所描述的,创建此登录页面的策略是什么?在登录后,将授予登录用户相应的权限?

我想到的破解将创建一个简单的JSP页面,只有功能是重定向回到上一页。然后我会使用Spring Security来保护那个JSP页面。但好像应该有这样做的更好的办法...

感谢

回答

2

当用户还没有登录,你可以把他当作匿名。因此该页面将隐藏标有<sec:authorize ifAllGranted="ROLE_SUPERVISOR">的所有内容。
有关更多详细信息,请参阅Anonymous Authentication

0

你必须设置always-use-default-target="false"使春季安全将自动重定向到前一页,如果它被设置为true,它将始终采用默认主页。该酒店位于form-login标签上。

+0

谢谢。但是,你认为你可以提供更多的细节来帮助我解决我的具体问题吗?基本上我想知道如何使用spring安全来创建一个登录页面来提供访问权限。到目前为止,我发现的所有内容都解释了如何保护某个页面。我希望能够基于他/她的ROLE(使用JSP标签)向用户显示不同的东西......谢谢 – oym 2010-02-03 22:04:08

+0

Spring安全性有安全标签,使用它可以控制jsp中的内容,例如使用' sec:授权ifAllGranted =“ROLE_SUPERVISOR”>,您只能向角色为supervisor的用户显示特定内容。这是您正在寻找的功能吗? – 2010-02-03 22:11:54

+0

是的。但我仍然感到困惑。基本上我需要一个登录页面,其目的是提升用户的角色(一旦他们成功登录)。也许你可以指点我如何做到这一点,因为我发现的所有教程都是关于如何限制对整个页面的访问...... – oym 2010-02-03 22:29:40

1

我不知道你是否还需要一个答案,因为你的问题是在二月,但一旦用户已经通过SS登录,您可以在您的控制器获得SS认证对象为:

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对象。

希望这会有所帮助。