복붙노트

[SPRING] 스프링 시큐리티를 사용하여 패스워드를 몰라도 자동으로 사용자로 로그인하는 방법?

SPRING

스프링 시큐리티를 사용하여 패스워드를 몰라도 자동으로 사용자로 로그인하는 방법?

내 응용 프로그램은 스프링 보안을 사용하고 클라이언트는 다음을 필요로합니다.

따라서 암호를 모른 채 자동으로 모든 사용자로 로그인하는 방법을 알아야합니다.

Spring Security를 ​​사용하여 어떻게이를 수행 할 수 있습니까?

해결법

  1. ==============================

    1.이 작업을 수행하려면 다음을 수행해야했습니다.

    이 작업을 수행하려면 다음을 수행해야했습니다.

    UserDetailsService (jdbcUserService)에 대한 참조 구성

    <authentication-manager>
    <authentication-provider>
    <jdbc-user-service id="jdbcUserService" data-source-ref="dataSource"
      users-by-username-query="select username,password, enabled from users where username=?" 
      authorities-by-username-query="select u.username, ur.authority from users u, user_roles ur where u.user_id = ur.user_id and u.username =?  " 
    />
    </authentication-provider>
    </authentication-manager>
    

    내 컨트롤러에서 내 userDetailsManager를 Autowire :

    @Autowired
    @Qualifier("jdbcUserService")  // <-- this references the bean id
    public UserDetailsManager userDetailsManager;
    

    같은 컨트롤러에서 내 사용자를 다음과 같이 인증하십시오.

    @RequestMapping("/automatic/login/test")
    public @ResponseBody String automaticLoginTest(HttpServletRequest request) 
    {
        String username = "anyUserName@YourSite.com";
    
        Boolean result = authenticateUserAndInitializeSessionByUsername(username, userDetailsManager, request);
    
        return result.toString();
    }
    
    public boolean authenticateUserAndInitializeSessionByUsername(String username, UserDetailsManager userDetailsManager, HttpServletRequest request)
    {
        boolean result = true;
    
        try
        {
            // generate session if one doesn't exist
            request.getSession();
    
            // Authenticate the user
            UserDetails user = userDetailsManager.loadUserByUsername(username);
            Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        catch (Exception e)
        {
          System.out.println(e.getMessage());
    
          result = false;
        }
    
        return result;
    }
    

    앱에 봄 보안을 사용하기위한 좋은 선구자는 여기에서 찾을 수 있습니다.

  2. ==============================

    2.두 번째 문제

    두 번째 문제

    당신은 봄부터 사용자 전환 기능을 사용해야합니다. javadoc 및 기사

  3. ==============================

    3.위 질문에 대한 답변입니다. 컨트롤러에서 :

    위 질문에 대한 답변입니다. 컨트롤러에서 :

    @RequestMapping(value = "/registerHere", method = RequestMethod.POST)
        public ModelAndView registerUser(@ModelAttribute("user") Users user, BindingResult result,
                HttpServletRequest request, HttpServletResponse response) {
            System.out.println("register 3");
    
            ModelAndView mv = new ModelAndView("/home");
            mv.addObject("homePagee", "true");
    
            String uname = user.getUsername();
    
            if (userDAO.getUserByName(uname) == null) {
    
                String passwordFromForm = user.getPassword();
                userDAO.saveOrUpdate(user);
    
                try {
                    authenticateUserAndSetSession(user, passwordFromForm, request);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
    
            }
    
            System.out.println("register 4");
    
            log.debug("Ending of the method registerUser");
            return mv;
        }
    

    컨트롤러의 위의 방법은 다음과 같이 정의됩니다.

    `private void authenticateUserAndSetSession(Users user, String passwor`dFromForm, HttpServletRequest request){
    
            String username = user.getUsername();
            System.out.println("username:  " + username + " password: " + passwordFromForm);                        
    
            UserDetails userDetails = userDetailsService.loadUserByUsername(user.getUsername());
    
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(username, passwordFromForm, userDetails.getAuthorities());
            request.getSession();
    
            System.out.println("Line Authentication 1");
    
            usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetails(request));
    
            System.out.println("Line Authentication 2");
    
            Authentication authenticatedUser = authenticationManager.authenticate(usernamePasswordAuthenticationToken);
    
            System.out.println("Line Authentication 3");
    
    
            if (usernamePasswordAuthenticationToken.isAuthenticated()) {
                SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
                System.out.println("Line Authentication 4");
    
            }
    
         request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());// creates context for that session.
    
            System.out.println("Line Authentication 5");
    
            session.setAttribute("username", user.getUsername());
    
            System.out.println("Line Authentication 6");
    
            session.setAttribute("authorities", usernamePasswordAuthenticationToken.getAuthorities());
    
            System.out.println("username:  " + user.getUsername() + "password: " + user.getPassword()+"authorities: "+ usernamePasswordAuthenticationToken.getAuthorities());
    
            user = userDAO.validate(user.getUsername(), user.getPassword());
            log.debug("You are successfully register");
    
        }
    

    다른 답변은 try / catch에 넣으려고 제안하지 않았으므로 코드가 실행될 때 논리가 작동하지 않는 이유를 알지 못합니다. 콘솔에 오류나 예외도 없습니다. 그래서 만약 당신이 그것을 잡으려고 시도 못해 나쁜 자격 증명의 예외를 얻을.

  4. from https://stackoverflow.com/questions/12057326/how-to-automatically-login-as-a-user-using-spring-security-without-knowing-their by cc-by-sa and MIT license