어제 emp에서 로그인하는것 설명추가
<password-encoder ref="customNoOpPasswordEncoder" /> //최신버전부터 패스워드에 암호화모듈을 넣게됨-실무에서도 무조건 넣음 <jdbc-user-service data-source-ref="dataSource" role-prefix="" users-by-username-query="select ename as username, empno as password,enabled from emp04 where UPPER(ename) LIKE UPPER(?)" authorities-by-username-query="select ename as username, CASE WHEN job ='MANAGER' THEN 'ROLE_ADMIN' else 'ROLE_USER' END as authority from emp04 where ename = ?" /> </authentication-provider>
<암호화 원리만 알기>
사용자가 정한 비밀번호를 개발자가 순서를 바꾸고(encoding) 해킹하기 어렵게 암호화를 만든다. -뻔하디뻔한 순서바꾸기는 해커들에게 잘털리기에 암호화알고리즘전문가가있는것임- 이걸 다시 제 순서대로 맞추는걸 decoding이라고 한다.
모든 암호화 과정에는 encoding과 decoding과정이 있다.
회원가입 만들기
UserController만들기
userForm.jsp만들기
password받는방식은 무조건 post방식으로!
[web.xml] - 오류나는거... security-context.xml 이거 같이 넣으면안됨 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/root-context.xml <!--/WEB-INF/spring/security-context.xml --> //하나는 무조건 없애기!!!!! /WEB-INF/spring/security-db-context.xml </param-value> </context-param>
[security-db-context.xml]에 /user/** 추가 <http> <intercept-url pattern="/login/loginForm" access="permitAll" /> <intercept-url pattern="/" access="permitAll" /> <intercept-url pattern="/user/**" access="permitAll" /> <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" /> <intercept-url pattern="/**" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
회원가입하고 로그인안되는원인은 디코딩을 다시 안해줬기때문
[security-db-context.xml]에서 password-encoder부분 수정 <!-- 여기추가 --> <beans:bean id="customNoOpPasswordEncoder" class="edu.bit.ex.security.CustomNoOpPasswordEncoder" /> <!-- addUser할때 필요. 추가. --> <beans:bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> <!-- provider --> <authentication-manager> <authentication-provider> <!-- 여기추가 --> //이부분 수정! 원랜 customNoOpPasswordEncoder였음 <password-encoder ref="bcryptPasswordEncoder" /> <jdbc-user-service data-source-ref="dataSource" role-prefix="" users-by-username-query="select username, password, enabled from users where username = ?" authorities-by-username-query="select username, authority from authorities where username = ?" /> </authentication-provider> </authentication-manager> </beans:beans>
해당파일 소스↓
================
스프링시큐리티에 올린 세션을 써먹기 위해서 jsp에서 principle을 사용한다.
[예시]
<p>
principal: <sec:authentication property="principal" />
</p>
<p>EmpVO: <sec:authentication property="principal.emp"/></p>
★커스텀마이징★했기때문에 principal.emp 즉 principal에서 emp를 가져올수도 있다.
실무에서는 무조건 이렇게 한다.(어디서도 이런설명은 없음)
이 세션을 어디에다 써먹을 수 있는지가 매우 중요
클래스를 스프링시큐리티에 쉐어하기위해 principal을 끼워넣는다!!★★★★
스프링시큐리티 활용방법
-스프링시큐리티로 쇼핑몰 카트도 다 이용가능하다.
세션객체를 principle에 넣고 돌리면 좋은 코드가 된다.(확장하기)
========
empVO로 예 만들기
EmpVO생성
EmpMapper생성
EmpService생성
패키지vo에 CustromUser.java생성-커스텀마이징의 핵심
src/main/resources 에 패키지 edu.bit.ex.mapper ㅏㅁ들기
확장시키려면 두개 필요
UserDetailsService랑
jdbc djwp sql문썼던거 그건빠빠이
[security-custom-context.xml]에 memberdetailsService객체를 생성 = memberdetailsService.java를 끌고오는것과 똑같.
loadUserByUsername(핵심.반드시 외우기)를 오버라이딩하게 되면 String username에는 admin (....?)
스프링시큐리티가 .xml에서 객체생성하라고했는데(authentication어쩌구에) 로그인할때 String username이 넘어오게 되는것.
스프링시큐리티의 법칙:로그인하게되면 loadUserByUsername을 무조건 받아옴.-그냥 이렇게 외워두기
UserDetails
[security-custom-context.xml]-왜인진모르겠음 계속오류떠서 선생님거 그냥 복붙함 오류내용 무슨 service에 빈이 생성안된다고... <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <http auto-config="true" use-expressions="true"> <intercept-url pattern="/login/loginForm" access="permitAll" /> <intercept-url pattern="/" access="permitAll" /> <intercept-url pattern="/admin/**" access="hasRole('ADMIN')" /> <intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')" /> <!--로그인 페이지 커스텀 화 --> <form-login login-page="/login/loginForm" default-target-url="/" authentication-failure-url="/login/loginForm?error" username-parameter="id" password-parameter="password" /> <logout logout-url="/logout" logout-success-url="/" /> <!-- 403 에러 처리 --> <access-denied-handler error-page="/login/accessDenied" /> </http> <!-- 얘 빠빠이 <beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="dataSource" /> </beans:bean> --> <beans:bean id="customNoOpPasswordEncoder" class="edu.bit.ex.security.CustomNoOpPasswordEncoder" /> <!-- 얘 추가 --> <beans:bean id="memberDetailsService" class="edu.bit.ex.security.MemberDetailsService" /> <!-- addUser할때 필요. 추가. --> <!--얘도 빠빠이는 아님 --> <beans:bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> <!-- provider --> <authentication-manager> <authentication-provider> <!-- ref="bcryptPasswordEncoder"를 "memberDetailsService"로 바꾸기 --> <password-encoder ref="memberDetailsService" /> <!-- 이제 이건 유물. 더 이상 쓰지않는다. <jdbc-user-service data-source-ref="dataSource" role-prefix="" users-by-username-query="select username, password, enabled from users where username = ?" authorities-by-username-query="select username, authority from authorities where username = ?" /> --> </authentication-provider> </authentication-manager> </beans:beans>
관련파일 - 이건 디코딩이안되어있기때문에 admin-admin만 가능
==================
오늘의 문제
1.emp 테이블을 스프링 시큐리티에서 커스텀마이징 하시오.
'코딩 > 수업 정리' 카테고리의 다른 글
21.02.23 [063] Tue (0) | 2021.02.23 |
---|---|
21.02.22 [062] Mon (0) | 2021.02.22 |
21.02.18 [060] Thu (0) | 2021.02.18 |
21.02.17 [059] Wed (0) | 2021.02.17 |
21.02.16 [058] Tue (0) | 2021.02.16 |
댓글