티스토리 뷰

스프링 시큐리티를 통해서 입력한 비밀번호를 암호화해서 로그인 인증처리를 하는 방법에 대해서 알아보겠습니다.


     <security:authentication-manager>

      <security:authentication-provider user-service-ref ="customUserDetailsService">

      <security:password-encoder ref="passwordEncoder"/>

      </security:authentication-provider>

     </security:authentication-manager>


   <bean id="customUserDetailsService" class="com.javalec.ex.UserService.CustomUserDetailsService">

      <property name="sqlsession" ref="sqlsession"></property>

   </bean>


  <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 


security-context.xml에 위와 같은 내용을 추가해줍니다.

스프링 시큐리티에서 로그인을 할때 입력된 비밀번호를 암호화를 한뒤 데이터 베이스에 있는 값과 비교를해서 인증을 허가 해줄지를 결정하게 되는데, 그때 필요한 패스워드 인코더가 바로 passwordEncoder 빈 입니다.


그러므로, 회원가입을 받을때에도 마찬가지로 저 패스워드 인코더를 사용해서 암호화 한다음에 데이터베이스에 값을 넣어야겠죠?


그다음은 customUserDetailsService(클릭시 전체 코드)에 대해 설명하겠습니다.


우선 customUserDetailsService은 UserDetailsService 라는 인터페이스를 구현한 클래스의 빈인데, 이 클래스가 하는 역할은 스프링 시큐리티에서 데이터베이스에서 로그인 하려고 하는 유저의 정보들을 가져오는 서비스 객체의 역할을 하게 됩니다.


그 로그인한 유저의 정보들은 UserDetails라는 인터페이스를 구현한 클래스에 담기게 되는것입니다. 

저는 그것을 CustomUserDetails라는 클래스에 담았습니다.



SqlSession은 Mybatis를 사용하기 위해서 설정한것입니다.


UserDetailsService 인터페이스를 구현하게 되면 자동으로 loadUserByUsername이라는 메소드가 오버라이드 되는데


이 메소드가 하는 역할은 입력한 아이디 값을 통해서 데이터베이스에서 값을 읽어오는데, 그 아이디에 해당하는 정보가 디비에 없을경우 예외를 발생시켜서 로그인을 못하게 하고,


디비에 있는경우 UserDto라는 dto객체에 로그인 정보를 담게 됩니다. (아래 쿼리문을 통해서 디비에서 값을 읽어옵니다.)


<select id="find_by_string_id" parameterType="String" resultType="UserDto">

SELECT * FROM USERINFO WHERE bId = #{bId}

</select>


그리고 나서 userdto의 값을 스프링 시큐리티가 인식할수있는 dto로 바꿔줘야 하기 때문에

로그인 한 유저의 정보는 UserDetails인터페이스를 구현한 CustomUserDetails 객체에 저장 되게끔 다시 저장했습니다.

(이부분은 애초에 쿼리문 리턴을 CustomUserDetails로 하면 좀더 깔끔하게 가능할 것 같습니다.)


그렇게 되면  스프링 시큐리티는


유저가 입력한 아이디를 통해 디비에서 읽어온 비밀번호 (이미 회원가입할때 암호화 되어있음)와

유저가 입력한 비밀번호를 암호화한 암호화된 비밀번호를 비교해서 로그인 인증을 처리해줄지 안할지를 결정하게 되는것입니다.



CustomUserDetails를 보면 이런게 있다.


로그인한 유저의 권한 정보를 반환하는 메소드이다. 나의 프로젝트에서는 권한이 로그인한것/안한것 2개만 필요하기 때문에 무조건 ROLE_USER라는 권한만 리턴하게끔 해놨는데


만약에 권한이 2개이상이 필요하다면 이것도 아까 위에서본 CustomUserDetailsService에서 디비를 통해 읽어와야 한다.






댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함