Spring mvc Spring自定义授权无法使用@PreAuthorize
我试图在我的spring(3.2.2)mvc应用程序中实现自定义的Spring mvc Spring自定义授权无法使用@PreAuthorize,spring-mvc,spring-security,authorization,Spring Mvc,Spring Security,Authorization,我试图在我的spring(3.2.2)mvc应用程序中实现自定义的@PreAuthorize方法。但是,每当我点击链接,该链接应该将我带到实现@PreAuthorize的控制器方法,它就会给我以下错误: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.security.authentication.Auth
@PreAuthorize
方法。但是,每当我点击链接,该链接应该将我带到实现@PreAuthorize
的控制器方法,它就会给我以下错误:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:339)
org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:198)
org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:60)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
com.nav.qanda.admin.question.controller.AdminQuestionController$$EnhancerByCGLIB$$5bcda356_2.handleRequest(<generated>)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
控制器如下所示:
@RequestMapping(value = "/createPandaPage", method = RequestMethod.GET)
@PreAuthorize("adminOnly()")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
return new ModelAndView("admin/createPanda");
}
web.xml:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
我的应用程序中的登录将从我的应用程序中填充一个用户对象(该对象的用户权限由数据库读取填充)。如何传递此用户对象以检查权限?还有,我还需要做些什么才能让它工作?导致调用此方法的请求需要通过Spring安全筛选器链,否则在检查权限时将没有可用的安全上下文 在没有看到stacktrace的其余部分的情况下,我不能说是100%,但考虑到您看到的异常(如果您搜索错误消息,您应该会发现类似的问题),这里的情况似乎就是这样
因此,您需要确保所有需要保护的请求都由安全筛选器链处理,并且您的筛选器链已正确配置(如果使用命名空间,则应自动配置)。导致调用此方法的请求需要通过Spring安全筛选器链,否则,在检查权限时将没有可用的安全上下文 在没有看到stacktrace的其余部分的情况下,我不能说是100%,但考虑到您看到的异常(如果您搜索错误消息,您应该会发现类似的问题),这里的情况似乎就是这样
因此,您需要确保所有需要保护的请求都由安全筛选器链处理,并且您的筛选器链已正确配置(如果使用命名空间,则应自动配置)。导致调用此方法的请求需要通过Spring安全筛选器链,否则,在检查权限时将没有可用的安全上下文 在没有看到stacktrace的其余部分的情况下,我不能说是100%,但考虑到您看到的异常(如果您搜索错误消息,您应该会发现类似的问题),这里的情况似乎就是这样
因此,您需要确保所有需要保护的请求都由安全筛选器链处理,并且您的筛选器链已正确配置(如果使用命名空间,则应自动配置)。导致调用此方法的请求需要通过Spring安全筛选器链,否则,在检查权限时将没有可用的安全上下文 在没有看到stacktrace的其余部分的情况下,我不能说是100%,但考虑到您看到的异常(如果您搜索错误消息,您应该会发现类似的问题),这里的情况似乎就是这样
因此,您需要确保所有需要保护的请求都由安全筛选器链处理,并且您的筛选器链已正确配置(如果使用命名空间,则应自动配置)。我已使用完整的堆栈跟踪更新了问题。我如何确保(除了发布的代码)请求正在通过Spring安全过滤器?我如何告诉Spring我的用户对象是需要检查用户权限的对象现在我的应用程序根本没有加载。有一个例子展示了如何使用自定义授权注释和自定义身份验证机制,这将与spring security一起工作?我已经用完整的堆栈跟踪更新了这个问题。我如何确保(除了发布的代码)请求正在通过Spring安全过滤器?我如何告诉Spring我的用户对象是需要检查用户权限的对象现在我的应用程序根本没有加载。有一个例子展示了如何使用自定义授权注释和自定义身份验证机制,这将与spring security一起工作?我已经用完整的堆栈跟踪更新了这个问题。我如何确保(除了发布的代码)请求正在通过Spring安全过滤器?我如何告诉Spring我的用户对象是需要检查用户权限的对象现在我的应用程序根本没有加载。有一个例子展示了如何使用自定义授权注释和自定义身份验证机制,这将与spring security一起工作?我已经用完整的堆栈跟踪更新了这个问题。我如何确保(除了发布的代码)请求正在通过Spring安全过滤器?我如何告诉Spring我的用户对象是需要检查用户权限的对象现在我的应用程序根本没有加载。有一个例子说明了如何使用自定义授权注释和自定义身份验证机制,这将与spring security一起工作?
@RequestMapping(value = "/createPandaPage", method = RequestMethod.GET)
@PreAuthorize("adminOnly()")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
return new ModelAndView("admin/createPanda");
}
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>