[SPRING] 스프링 시큐리티를 사용하여 패스워드를 몰라도 자동으로 사용자로 로그인하는 방법?
SPRING스프링 시큐리티를 사용하여 패스워드를 몰라도 자동으로 사용자로 로그인하는 방법?
내 응용 프로그램은 스프링 보안을 사용하고 클라이언트는 다음을 필요로합니다.
따라서 암호를 모른 채 자동으로 모든 사용자로 로그인하는 방법을 알아야합니다.
Spring Security를 사용하여 어떻게이를 수행 할 수 있습니까?
해결법
-
==============================
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.두 번째 문제
두 번째 문제
당신은 봄부터 사용자 전환 기능을 사용해야합니다. javadoc 및 기사
-
==============================
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에 넣으려고 제안하지 않았으므로 코드가 실행될 때 논리가 작동하지 않는 이유를 알지 못합니다. 콘솔에 오류나 예외도 없습니다. 그래서 만약 당신이 그것을 잡으려고 시도 못해 나쁜 자격 증명의 예외를 얻을.
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
'SPRING' 카테고리의 다른 글
[SPRING] angularjs + 봄 mvc + json 게시물 요청 (0) | 2019.03.23 |
---|---|
[SPRING] Spring 3.0 애플리케이션에서 Hibernate 통계를 어떻게 설정 하는가? (0) | 2019.03.23 |
[SPRING] 로그 아웃 한 후 페이지를 확보하지 못하고 뒤로 버튼을 클릭하십시오. (0) | 2019.03.23 |
[SPRING] 최대 절전 모드 - 항아리 내에서 스캔되지 않은 스프링 주석 처리 된 엔티티 (0) | 2019.03.23 |
[SPRING] @PreAuthorize 주석을 사용하여 예외없이 메소드 호출 방지 (0) | 2019.03.23 |