Какой лучший способ получить зарегистрированного пользователя с весенней безопасностью? - PullRequest
0 голосов
/ 03 апреля 2012

Я разрабатываю веб-приложение, которое использует Spring Security для аутентификации пользователей.Я знаю, что могу получить зарегистрированного пользователя таким образом:

public class SecurityUtil {
    public static User getCurrentUser() {
        SecurityContextHolder.getContext().getAuthentication().getPrincipal()
    }
}

И таким образом работает отлично.Вопрос в том, каков наилучший способ получить доступ к этому значению?Я приведу несколько примеров:

1.Пользователь объявлен как переменная в контроллере:

public class FooController {

    @Autowired
    private FooService fooService;

    private User u = SecurityUtil.getCurrentUser();

    @RequestMapping(...)
    public void control() {

        fooService.doSomething(u);
    }
}

2.Пользователь передан службе как параметр:

public class FooController {

    @Autowired
    private FooService fooService;

    public void control() {

        fooService.doSomething(SecurityUtil.getCurrentUser());
    }
}

3. Доступ пользователя к сервису:

public class FooService {

    public void doSomething() {

        SecurityUtil.getCurrentUser();
        //Do something
    }
}

Все ли эти примеры верны?Могу ли я использовать кого-нибудь из них невнятно?Есть некоторые недостатки, о которых я должен знать?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Пример 1

Пример 1 не может использоваться, поскольку по умолчанию Spring bean-компонент одноэлементный, что означает, что при создании FooController переменная User назначается неправильноили это null.Как указывает другой ответ, он также не безопасен для потоков.

Пример 2

Пример 2 - мой рекомендуемый способ сделать это, он более тестируем в модульном тесте,Но я бы рекомендовал использовать следующий пример (Spring 3), см. Документ здесь :

@RequestMapping(method = RequestMethod.GET)
public String index(Model m, HttpSession session, Principal principal) {
    // principal.getName() return username
    return "XYZ";
}

Пример 3

Пример 3 можно использовать, но не легко тестируемый и сложный в обслуживании.

0 голосов
/ 03 апреля 2012

Пример 1 не является потокобезопасным.В общем случае ваши сервисные компоненты не должны иметь состояния.

В примере 3 это зависит от того, как вы вызываете FooService из вашего контроллера.Если этот вызов пересекает границы приложения, то вам нужно убедиться, что Spring SecurityContext распространяется с вызовом, чтобы он работал.

Пример два должен подойти во всех случаях, но передача текущего пользователя в метод службы не делает 'не похоже на правильное разделение интересов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...