3

我正在尝试使用 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);
    }

    . . .

在这种情况下,安全工作正常,但我想知道是否有另一种方法。由于我的抽象类中有很多方法,这将产生一个问题和混乱来覆盖所有方法只是为了调用超级。

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

谢谢大家的帮助:)

4

1 回答 1

8

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

抽象超类:

@PreAuthorize("hasAnyRole(this.roles)")
public abstract class DataController<E extends PersistentEntity> 
{
    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是另一种检查身份验证的方法,它允许您使用 SpEL 表达式。this.rolesgetRoles()注解对象上的属性。

于 2014-07-14T17:28:16.830 回答