1

我正在使用 spring MVC,并且我有一个必须构建的自定义身份验证/安全系统。

NOTE:  I know of spring security, but my requirements were to do this in a custom way so please not looking for suggestions about using spring's security modules.

当用户登录系统时,它会创建一个会话 cookie。当用户访问页面时,拦截器会查找该 cookie 的存在,并在 mysql 中查找会话 guid,如果存在,它会加载一些数据并将其存储在请求的属性中。

现在对于用户必须登录的页面,如何在控制器级别限制访问?

我可以在拦截器中做到这一点:

if url.contains("projects/") ...

如果我想限制对 ProjectController 中的登录用户的访问,但这并不是我真正想做的事情。

但是我正在寻找一个可以在控制器级别添加的注释,或者可能以某种方式创建一个 BaseController ,所有需要登录用户的控制器都将从该控制器继承。

对于这样的事情,我有什么选择?

在 ASP.NET 中,我创建了一个 baseController,并且该控制器有一个事件循环,并且在操作前触发的事件中我检查了用户是否已登录。

那么寻找有关spring mvc的建议吗?

更新

例如,在 ASP.NET 中,您有 2 种方法,一种在控制器的操作方法之前触发,另一种在之后触发:

Controller.OnActionExecuting 
Controller.OnActionExecuted

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onactionexecuting.aspx

所以在 OnActionExecuting 中,我实际上可以确切地看到我在哪个控制器中,以及哪个动作将以编程方式被调用,而不是通过查看请求 URL 然后进行字符串比较以查看它是否是特定控制器等.

所以在这种情况下,我可以简单地检查 cookie 或我的请求属性等中的内容。

这是一种更稳定的方法,spring有类似的吗?

4

2 回答 2

2

如果您在控制器级别需要此功能,您可以:

1)在控制器方法签名中声明一个java.security.Principal参数,Spring会用一个Principal对象来填充,或者

2) 实现一个PermissionEvaluator,它可以使用@PreAuthorize注释在控制器方法上调用,并且可以访问Authentication对象。

于 2012-04-09T18:47:47.957 回答
0

与您在 ASP.NET 中所做的类似,您可以利用OncePerRequestFilter它并将其链接到您拥有的过滤器链web.xml或 Spring 应用程序上下文中。这个过滤器的好处是它独立于您采用的 MVC 方法,并且不需要“基本控制器”。

另一方面,如果您还使用 Spring 安全模块,则可以使用自定义过滤器配置并将其放置在应有正确位置

如果检查失败,那么您可能希望引发异常或将用户重定向到正确的导航。

根据最后一条评论,您还可以使用映射拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <mapping path="/myFirstPath/*"/>
        <mapping path="/mySecondPath/*"/>
        <bean class="org.example.SomeInteceptor" />
    </mvc:interceptor>
    <mvc:interceptor>another one</mvc:interceptor>
</mvc:interceptors>
于 2012-04-09T18:08:34.763 回答