2016-11-16 7 views
1

Привет, у меня есть приложение, которое использует свою собственную реализацию для аутентификации пользователя, сохраняя пользовательское pojo в HttpSession и аннулируя этот объект HttpSession при выполнении сеанса, но что я хотите сделать это, чтобы использовать контекст безопасности для аутентификации пользователя. давайте говорить, что у меня есть сервлет AuthenticateUserServlet:Как выполнить аутентификацию и создать сеанс программно в контексте безопасности

public void doPost(HttpServletRequest req,HttpServletResponse resp) 
throws ServletException,IOException{ 
    String username=req.getParameter("username"); 
    String password=req.getParameter("password"); 
    if(Authenticator.check(username,password)){ 
     HttpSession session=req.getSession(true); 
     session.setAttribute("user",Authenticator.getUser(username)); 
     PrintWriter out= req.getWriter(); 
     out.println("<h2>Welcome</h2>"); 

    }else{ 
     PrintWriter out= req.getWriter(); 
     out.println("<h2>the password or username are incorrect</h2>"); 
    } 
} 

код выше, не даст мне силы контекста безопасности, с тем, что я wan't это когда я проверить, что пользователь нормально для входа сказать в некотором образе контекст безопасности, что этот пользователь может получить доступ здесь его роль что-то вроде этого в моей AuthenticateUserServlet:

 public void doPost(HttpServletRequest req,HttpServletResponse resp) 
throws ServletException,IOException{ 
    String username=req.getParameter("username"); 
    String password=req.getParameter("password"); 
    LoginContext lc = new LoginContext("my-jaas",new MyCallbackHandler(username,password)); 
    try{ 
     lc.login(); 
     //notice i have not save any thing in the HTTPSeession 
     //i want my container to remember this user like what happens in the 
     // form based authentication where nothing gets saved in the httpSession 
     // but the user keeps logged in(cartalina uses a session object not httpsession for that) 
     PrintWriter out= req.getWriter(); 
     out.println("<h2>Welcome</h2>"); 
    } 
    catch(LoginException e){ 
     PrintWriter out= req.getWriter(); 
     out.println(e.getMessage()); 
    } 


} 

я создал свой собственный LoginModule («My-JAAS») и она отлично работает, когда я настроить проверку подлинности на основе форм работать с ним в tomcat7.

ответ

2

С Servlet 3.0, есть login метод HttpServletRequest (https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#login(java.lang.String,%20java.lang.String)), так что вы можете войти как

public void doPost(HttpServletRequest req,HttpServletResponse resp) 
throws ServletException,IOException{ 
    String username=req.getParameter("username"); 
    String password=req.getParameter("password"); 
    try{ 
     req.login(username, password); 
     PrintWriter out= req.getWriter(); 
     out.println("<h2>Welcome</h2>"); 
    } catch(ServletException e){ 
     PrintWriter out= req.getWriter(); 
     out.println(e.getMessage()); 
    }   
} 
+0

человека, которого ты оставил меня spechless, это было в моих глазах; не могу поблагодарить вас достаточно – achabahe

+1

рад, что я мог бы помочь :-) – flo