@j_dmg

Почему Apache Shiro возвращает последнего авторизованного юзера всем подряд?

Добрый день! Изучаю Shiro и столкнулся с проблемкой - если войти в учетку с одного браузера, на всех остальных браузерах при проверке /current-user/ возвращается тот же самый пользователь, а не guest. Бьюсь уже второй день, гугл тоже не знает в чем дело. Заранее благодарю за помощь!

public class ShiroManager {
    private SecurityManager securityManager;
    private static ShiroManager shiroManager;

    public static synchronized ShiroManager getInstance() {
        if (shiroManager != null) {
            return shiroManager;
        } else {
            shiroManager = new ShiroManager();
            return shiroManager;
        }
    }

    private ShiroManager() {
        securityManager = new DefaultSecurityManager(addAccounts());
        SecurityUtils.setSecurityManager(securityManager);
    }

    private SimpleAccountRealm addAccounts() {
        SimpleAccountRealm r = new SimpleAccountRealm();
        r.addAccount("user", "user");
        r.addAccount("admin", "admin");

        return r;
    }
}


@Path("/rest")
public class Rest {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Path("/current-user/")
    public String getCurrentUser(@Context HttpServletRequest request) {

        ShiroManager.getInstance();

        Subject user = ThreadContext.getSubject();

        if (user != null && user.isAuthenticated())
            return (String) user.getPrincipal();
        else
            return "guest";
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Path("/signin/")
    public String signIn(@Context HttpServletRequest request) {

        ShiroManager.getInstance();

        //JAX-RS без привязки к конкретным реализациям не умеет вытаскивать
        // поля из multipart/form-data, поэтому пока решил вытаскивать с помощью Apache FileUpload
        Map<String, String> fields = new MultipartLoaderImpl(request).getFields();

        Subject user = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(fields.get("username"), fields.get("password"));
        user.login(token);

        return "sign in complete";
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Path("/logout/")
    public String logout() {
        ShiroManager.getInstance();

        Subject user = ThreadContext.getSubject();

        if (user != null){
            user.logout();

            return "OK";
        } else {
            return "user = null";
        }

    }
}
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
@grinat
Я вижу тута какие-то синглтоны, подозреваю он запоминает одного юзера и держит в памяти его, ну то есть контекст один на всех, а не разный при каждом запросе.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы