java - 具有 Spring Security 的 Spring MVC Controller 继承

标签 java spring-mvc spring-security

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

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";
    }
}

我的扩展类将在类名中有一个特定的 Controller 映射,这样我就可以使用 Controller 名访问 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 的 Controller 中定义。

这可以通过覆盖 View 方法并在我的公司类中定义映射来解决:

    . . .

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

    . . .

在这种情况下安全工作正常,但我想知道是否有其他方法。因为我的抽象类中有很多方法,这会产生一个问题和困惑来覆盖所有方法只是为了调用 super。

有办法解决这个问题吗?

感谢大家的帮助:)

最佳答案

我知道这是一年后的事了,但我遇到了同样的问题并想出了一个可能的解决方案。它不是 100% 基于注释,但可以工作并且有点优雅

抽象父类(super class):

@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.roles 引用注释对象的 getRoles() 属性。

关于java - 具有 Spring Security 的 Spring MVC Controller 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17721523/

相关文章:

java - 如何删除 URL 中的参数?

java - spring 3.1 maven 依赖项和 pom.xml

spring - CorsWebFilter 不适用于分配有 hasAnyRole(...) 的安全路由,但适用于分配有 permitAll() 的安全路由

java - JSESSIONID 是如何传递的?作为 header 参数还是作为 cookie 参数?

java - 替换android中文件的第一行

java - Struts2 模型驱动的验证不起作用

java - 当我尝试用数据填充表格时出错

java - JSONObject 不显示在 ListView 上

Tomcat 未调用 Spring MVC Controller

java - 使用 Spring Security OAuth2 刷新 token 为 null