어제 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 |
댓글