2013-07-18 3 views
2

스프링 mvc 3.2.3 및 스프링 보안 3.1.3을 사용하여 일반 컨트롤러를 만들려고합니다. 내가 뭘 달성하기 위해 노력하고있어이 같은 것입니다 :스프링 보안이 적용된 스프링 MVC 컨트롤러 상속

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에 의해 ​​보호되지 않으며 @Secured가 사용되는 컨트롤러에서/view가 정의되지 않았기 때문에 누구나 액세스 할 수 있다는 것입니다. 보안이 제대로 작동이 경우

. . . 

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

    . . . 

,하지만 난 다른 방법이 있는지 알고 싶어 :

그냥보기 방법을 무시하고 내 회사 클래스의 매핑을 정의하여 해결할 수 있습니다. 내 추상 클래스에 많은 메소드가 있기 때문에,이 메소드는 문제를 일으키고 모든 메소드를 재정의하여 슈퍼를 호출한다.

이 문제를 해결할 방법이 있습니까?

덕분에 모든 도움 :

답변

4

위해 내가 나중에 년 알고,하지만 난 같은 문제를 가지고 있었고, 이에 대한 가능한 해결책을 알아 냈어. 그것은 기반의 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.roles은 주석 처리 된 객체에 대한 속성이 getRoles()임을 나타냅니다.

+0

다른 역할 권한을 가진 여러 가지 방법이 있다면 어떻게됩니까? 여기에 컨트롤러 액세스 권한이 있습니다. 메서드 수준에서 사용 권한이 있어야합니다. – singe3

+0

비슷한 주석을 메서드 수준에 넣을 수 있어야합니다. 다른 방법에 대해 서로 다른 소스를 정의해야 할 수도 있습니다. 위에서 나는 getRoles() 메소드를 가지고있다. 'getRolesFunction1()','getRolesFunction2()'등의 메소드가 필요하다. 당신의 메소드에'@PreAuthorize ("hasAnyRole (this.rolesFunction1)")'등으로 주석을 달아라. –

관련 문제