在Controller上使用@RolesAllowed并获取“对象不是声明类的实例”

时间:2012-02-07 19:54:26

标签: java spring spring-mvc controller spring-security

我正在尝试使用Method Security,所以我放了dispatcher-servlet.xml(security.xml在另一个上下文中):

<security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />

将@RolesAllowed放在Controller上:

@SessionAttributes({"sessionCompanyDetails"})
@Controller
@RequestMapping("/company")
@RolesAllowed("ROLE_ADMIN")
public class CompanyController extends BaseController {
  ...

我意识到当我使用这些注释时,Spring会生成一个代理到控制器,因此我得到了错误:

java.lang.IllegalArgumentException:object is not an instance of declaring class

2 个答案:

答案 0 :(得分:2)

出现问题是因为Controller没有接口,所以Spring创建了一个代理但不能转换为Controller类。

可能的解决方案是:

  1. 拦截器:使用MethodSecurityInterceptor和AccessDecisionManager
  2. 使用激活CGLib代理的<global-method-security proxy-target-class="true"/>(代理类是子类),所以Spring可以投射它。
  3. 创建Controller的界面。
  4. 使用ApectJ。
  5. 我测试了除ApectJ之外的所有解决方案。我正在使用CGLib解决方案用于一个项目而另一个我使用Interceptor,两种解决方案都可以正常工作。

答案 1 :(得分:0)

请提供更多信息。

  1. 使用特定代码行号(原因)抛出异常?
  2. 您想使用JSR250-Annotations(@RolesAllowed)还是Spring-Way-Annotations(@Secured)?