5

我想访问当前登录的用户我这样做(从静态方法)

public static User getCurrentUser() {

final Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

if (principal instanceof User) {
  return (User) principal;
  }
}

或像这样注入和铸造:

@RequestMapping(value = "/Foo/{id}", method = RequestMethod.GET)
public ModelAndView getFoo(@PathVariable Long id, Principal principal) {
        User user = (User) ((Authentication) principal).getPrincipal();
..

在用户实现 userdetails 的地方,两者似乎都有些蹩脚,在 Spring 3.2 中有更好的方法吗?

4

2 回答 2

4

我不认为它spring 3.2为此目的有什么新东西。您是否考虑过使用自定义注释?

像这样的东西:

带有自定义注释的控制器:

@Controller
public class FooController {

    @RequestMapping(value="/foo/bar", method=RequestMethod.GET)
    public String fooAction(@LoggedUser User user) {
        System.out.print.println(user.getName());
        return "foo";
    }
}

LoggedUser 注释:

@Target(ElementType.PARAMETER)
@Retention(RententionPolicy.RUNTIME)
@Documented
public @interface LoggedUser {}

WebArgumentResolver :

public class LoggedUserWebArgumentResolver implements WebArgumentResolver {

    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
        Annotation[] annotations = methodParameter.getParameterAnnotations();

        if (methodParameter.getParameterType().equals(User.class)) {
            for (Annotation annotation : annotations) {
                if (LoggedUser.class.isInstance(annotation)) {
                    Principal principal = webRequest.getUserPrincipal();
                    return (User)((Authentication) principal).getPrincipal();
                }
            }
        }
        return WebArgumentResolver.UNRESOLVED;
    }
}

豆类配置:

<bean id="loggedUserResolver" class="com.package.LoggedUserWebArgumentResolver" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver" ref="loggedUserResolver" />
</bean>
于 2013-01-14T21:35:26.933 回答
0

我创建了一个与您的静态方法非常相似的方法,但是将它放在一个新的 spring bean 中并将该 bean 注入到控制器(或其他层的对象)中,我需要在其中获取有关用户的信息。这样我就避免了测试依赖于静态的代码的困难,并且所有与 SecurityContext 混淆的代码都很好地封装到我的 bean 中(就像你在静态中一样)

于 2013-09-03T19:28:37.090 回答