我正在尝试使用 spring mvc 3.2.3 和 spring security 3.1.3 创建一个通用控制器。我想要实现的是这样的:
public abstract class DataController<E extends PersistentEntity> {
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<Company> {
@Autowired
private AppService appService;
@Override
protected Company getEntity(String id) {
return appService.getCompany(id);
}
}
我的问题是 url /company/view 不受 ROLE_ADMIN 保护,任何人都可以访问,(我认为)因为 /view 没有在使用 @Secured 的控制器中定义。
这可以通过覆盖视图方法并在我的公司类中定义映射来解决:
. . .
@Override
@RequestMapping(value = "/view/{id}", method = RequestMethod.GET)
public String view(String id, ModelMap map) {
return super.view(id, map);
}
. . .
在这种情况下,安全工作正常,但我想知道是否有另一种方法。由于我的抽象类中有很多方法,这将产生一个问题和混乱来覆盖所有方法只是为了调用超级。
有没有办法解决这个问题?
谢谢大家的帮助:)