Spring MVC控制器inheritanceSpring安全性

我正在尝试使用spring mvc 3.2.3和spring security 3.1.3创建一个通用控制器。 我想要实现的是这样的:

public abstract class DataController { protected abstract E getEntity(String id); @RequestMapping(value="/view/{id}", method=RequestMethod.GET) public String view(@PathVariable("id") String id, ModelMap map) { E ent = getEntity(id); map.put("entity", entity); return "showEntity"; } } 

我的扩展类将在类名中有一个特定的控制器映射,以便我可以使用控制器名称访问该URL:

 @Controller @RequestMapping("/company**") @Secured("ROLE_ADMIN") public class CompaniesController extends DataController { @Autowired private AppService appService; @Override protected Company getEntity(String id) { return appService.getCompany(id); } } 

我的问题是url / company / view不受ROLE_ADMIN保护,并且任何人都可以访问(我认为),因为/ view未在使用@Secured的控制器中定义。

这可以通过重写view方法并在我的公司类中定义映射来解决:

  . . . @Override @RequestMapping(value = "/view/{id}", method = RequestMethod.GET) public String view(String id, ModelMap map) { return super.view(id, map); } . . . 

在这种情况下,安全性正常,但我想知道是否有另一种方法。 因为我的抽象类中有很多方法,所以这会产生一个问题,并且只是为了调用super而覆盖所有方法。

有没有办法解决这个问题?

谢谢大家的帮助:)

我知道这是一年之后,但我遇到了同样的问题,并为此找到了可能的解决方案。 它不是基于100%注释,但有效并且有点优雅

抽象超类:

 @PreAuthorize("hasAnyRole(this.roles)") public abstract class DataController { protected abstract E getEntity(String id); protected abstract String[] getRoles(); @RequestMapping(value="/view/{id}", method=RequestMethod.GET) public String view(@PathVariable("id") String id, ModelMap map) { E ent = getEntity(id); map.put("entity", entity); return "showEntity"; } } 

在子类上,您只需实现getRoles()以返回访问此类所需的角色数组。

@PreAuthorize是另一种检查身份validation的方法,它允许您使用SpEL表达式。 this.roles指的是带注释对象的getRoles()属性。