본문 바로가기
코딩/수업 정리

21.02.19 [061] Fri

by 6^6 2021. 2. 19.
728x90

 

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

해당파일 소스↓

spring_security5_emp.zip
0.04MB

 

 

================

스프링시큐리티에 올린 세션을 써먹기 위해서 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만 가능

 

spring_security5_emp.zip
0.06MB

==================

 

 

오늘의 문제

1.emp 테이블을 스프링 시큐리티에서 커스텀마이징 하시오.

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

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

댓글