Spring MVC,访问者和经过身份验证的成员的最佳实践控制器逻辑

时间:2016-03-01 22:58:39

标签: spring spring-mvc

我正在一个网站上工作,登录成员可以组织活动并订阅其他人的活动。现在,我已经定义了一些沿着业务对象划分的不同控制器。 因此,有一个ActivityController用于创建,修改,订阅活动和查看您自己的订阅活动以及当前活动议程。还有一个会员控制器,用于查看会员信息并编辑您自己的个人资料。

大多数操作仅适用于已登录的成员。但是,对于未登录的访问者,有一些操作,例如注册,登录以及有关该网站的一些常规信息。 此外,我想让访问者能够看到活动议程,但隐藏一些细节,例如活动的确切时间和地点。

这使我目前的方法有点问题。不能在访问者和成员之间严格划分行动。例如,访问者和成员都可以看到活动议程,但登录成员可以看到更多详细信息。 仍然存在仅适用于成员的操作,例如查看活动详细信息,组织活动和订阅它们。对于这些操作,我想使用HandlerInterceptor在未登录的访问者调用url时重定向到登录页面。

为仅限访问者的操作,仅限成员的操作以及针对访问者和成员的操作(但效果略有不同)制作单独的控制器是否有意义。或者我们应该根据业务对象划分控制器,并在MVC配置文件中定义的SecurityInterceptor路径模式中处理重定向到URL基础上的登录页面:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new SecurityInterceptor())
        .addPathPatterns("/activities/**", ...);
}

或者我们应该一方面为“仅限会员”操作定义完全不同的操作(使用不同的URL模式),如果没有登录会话,则始终重定向到登录页面,以及未经过身份验证的用户也可以访问的操作另一方面? 我希望我明确指出,我知道这不是一个技术问题,而是更多的设计问题,并希望得到一些提示!

1 个答案:

答案 0 :(得分:0)

我通过将方法放在逻辑上有意义的控制器中处理类似的情况,但这可能在您的情况下,但随后将@PreAuthorize注释添加到任何需要限制的方法。在您的情况下,类似于以下内容:

@PreAuthorize("hasRole('MEMBER')")
@RequestMapping("/members")
public String membersOnly() {
    // Do Stuff
}

这样,如果访问者试图访问该方法,则他们不能,而是被发送到登录页面。

对于两者都可以访问的方法,只需在安全注释中同时允许这两种方法即可解决:

@PreAuthorize("hasAnyRole('MEMBER', 'VISITOR')")