2016-03-01 52 views
0

我正在登录成员可以组织活动并订阅其他人的活动的网站上工作。目前,我已经定义了一些按业务对象划分的不同控制器。 因此,有一个ActivityController用于创建,修改,订阅活动并查看您自己订阅的活动以及当前的活动日程。还有一个MemberController用于查看成员信息并编辑您自己的配置文件。Spring MVC,访问者和认证成员的最佳实践控制逻辑

大部分操作仅针对登录成员。但是对于未登录的访问者有一些操作,例如注册,登录和关于网站的一些一般信息。 另外,我想让访问者能够看到活动日程,但隐藏了一些细节,比如活动的确切时间和位置。

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

是否有意义为访问者只有动作制定单独的控制器,仅针对访问者和成员的成员动作和动作(但影响稍有不同)。或者我们应该根据业务对象划分控制器和处理重定向到登录的网址基页中的MVC配置文件中定义的SecurityInterceptor路径模式:

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

或者我们应该定义完全不同的行为(具有不同URL模式),一方面总是重定向到登录页面,如果没有登录会话,另一方面也可以访问未经授权的用户访问的操作? 我希望我的观点清楚,我意识到这不是一个真正的技术问题,而是更多的设计问题和希望的一些提示!

回答

0

我处理类似的情况,将方法放在逻辑上合理的控制器中,但可能会出现在您的情况中,但会将@PreAuthorize注释添加到任何需要限制的方法中。在你的情况下,类似如下:

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

这样一来,如果访问者试图访问该方法时,他们不能,并改为发送到登录页面。

在可以通过这两种访问方法的情况下,这是通过简单地都在你的安全注解允许解决:

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

谢谢您的回答,我明白了针锋相对的是Spring Security的注解该怎么办现在不使用。它似乎有一个非常陡峭的学习曲线,但也许值得考虑。对于这两种可访问的方法,您是否可以为不同角色处理(稍微)不同的实现? – klausch

+0

是的,在共享方法中,你可以用if(request.isUserInRole(“MEMBER”))来包装成员(或访问者)特定的内容, – Colin