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

21.02.17 [059] Wed

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

 

 

 

 

스프링 do filter

★필터 위치만 이라도 알아두기

로그인을 낚아채는 원리만이라도 알기

dofilter 12개를 생성하면 인터셉터(디스패쳐서블릿)전에서 dofilter가 로그인을 낚아챈다.(빨간색 네모부분!)

이걸 하기위해 web.xml에 어제 filter를 넣어준것!(복붙 순서 매우 중요)★

 

어제거 이어서~~~

  가장기본적인 셋팅(설명1)	
================================================================
	<http> 
		<form-login />
	</http> 
	
	<!-- provider --> 
	<authentication-manager>

	</authentication-manager>

 

 

 가장기본적인 셋팅(설명2)

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

  가장기본적인 셋팅(설명2)
================================================================
	<http> 
		<intercept-url pattern="/security/all" access="permitAll" />
		<intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" />  
		<form-login />
	</http> 
	
	<!-- provider --> 
	<authentication-manager>

	</authentication-manager>
================================================================

[security-context.xml]에 이 부분 추가

<intercept-url pattern="/security/all" access="permitAll" />
<intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" /> 

--/security/member 치고 들어가면 'ROLE_MEMBER'권한을 가진 사람들에게만 로그인페이지 나타남

security-context.xml 전체 코드 더보기↓

더보기

 

 

xml수정과 컨트롤러와 jsp 추가

[security-context.xml]
<?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>
		<intercept-url pattern="/security/all"
			access="permitAll" />
		<intercept-url pattern="/security/member"
			access="hasRole('ROLE_MEMBER')" />
		<form-login />
	</http>

	<!-- provider -->
	<authentication-manager>

	</authentication-manager>


</beans:beans>
package edu.bit.ex;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import lombok.extern.log4j.Log4j;

/**
 * Handles requests for the application home page.
 */
@Log4j
@Controller
[SecurityController.java]
@RequestMapping("/security/*")
public class SecurityController {

	// /security/all로 치고들어오면 모든사람들이 들어갈수 있음(모든 사람 허용)
	@GetMapping("/all")
	public void doAll() {
		log.info("do all can access everybody");
	}

	// /security/member로 치고들어오면 member롤을 가진사람만 들어갈 수 있음
	@GetMapping("/member")
	public void doMember() {

		log.info("logined member");
	}

}
[member.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>/sample/member page</h1>
</body>
</html>
[all.jsp] - 이 코드는 외우기
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>    
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- all or member or admin -->
<h1>/sample/all page</h1>

<!-- anonymous 익명이기때문에 인증된 사람x 모든사람 접근 가능 -->
<sec:authorize access="isAnonymous()">

  <a href="/customLogin">로그인</a>

</sec:authorize>

<sec:authorize access="isAuthenticated()">

  <a href="/customLogout">로그아웃</a>

</sec:authorize>

</body>
</html>

↑ /security/member로 치고들어가면 자동으로 /login으로 바뀐다.

<intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" /> 이 부분이 액세스에 대한 권한을 지정해준것임

 

 

인증과 권한이 있는데 member role만 권한이 주어짐. 그럼 줘야하는 리소스는 무엇?

권한을 지정해줬는데 권한이 없는사람이 들어가면 인증을 디폴트로 시킨다.-그게 로그인 페이지

우리는 리소스를 html로 변환해서 다시 유저한테 보여줄뿐...!

유저가 리소스에 접근하는 방법은 url밖에 없다.

 

 

 

 가장기본적인 셋팅(설명3) - 실무에선 이렇게 안함. 그냥 테스트용. 하지만 알긴알아야함.

-실무에선 저렇게 name,password 이렇게 안가져오고 다 DB에서 가져옴

 가장기본적인 셋팅(설명3)	
  1.스프링 5 부터  PasswordEncoder 를 사용하도록 강제하고 있음
  만일 패스워드 인코딩 없이 사용 하고 싶다면 {noop}을 추가 함
================================================================
	<http> 
		<intercept-url pattern="/security/all" access="permitAll" />
		<intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" />  
		<form-login />
	</http> 
	
	<!-- provider --> 
	<authentication-manager>
		<authentication-provider> 
			<user-service> 
				<user name="member" password="{noop}member" authorities="ROLE_MEMBER" /> 
			</user-service> 
		</authentication-provider>
	</authentication-manager>
================================================================

provider 이 부분은 다 객체이다.

[security-context.xml] 이 부분만 수정
<?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>
		<intercept-url pattern="/security/all"
			access="permitAll" />
		<intercept-url pattern="/security/member"
			access="hasRole('ROLE_MEMBER')" />
		<form-login />
	</http>

	<!-- provider -->
	<authentication-manager>
		<authentication-provider>
			<user-service>
				<user name="member" password="{noop}member"
					authorities="ROLE_MEMBER" />
			</user-service>
		</authentication-provider>
	</authentication-manager>

</beans:beans>

2번째 방법에서 /security/member치고 들어가면 login이 떴는데 그 창에서 아이디 member, 비번 member을 치고 들어가면 밑에 화면처럼 뜬다.

security-context.xml에서 비번에 {noop}member를 안하면 인코딩이 안됐다는 에러가 뜬다.(스프링5버전 이후부턴 무조건 {noop} 적어야함)

 

 

 가장기본적인 셋팅(설명4) - admin추가, principle 사용법

  가장기본적인 셋팅(설명4)	
================================================================
	<http> 
		<intercept-url pattern="/security/all" access="permitAll" />
		<intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" />  
		<intercept-url pattern="/security/admin" access="hasRole('ROLE_ADMIN')" />  
		<form-login />
	</http> 
	
	<!-- provider --> 
	<authentication-manager>
		<authentication-provider> 
			<user-service> 
				<user name="member" password="{noop}member" authorities="ROLE_MEMBER" /> 
				<user name="admin" password="{noop}admin" authorities="ROLE_MEMBER,ROLE_ADMIN" /> 
			</user-service> 
		</authentication-provider>
	</authentication-manager>

xml에 admin관련을 intercept와 provider 넣는다.

 

인터셉터에서도 db에서 가져와서 넘겼는데 스프링 시큐리티를 쓰게되면 그럴필요가 없다.

user정보는 기본적으로 session(세션)안에 시큐리티 관련된 유저정보를 올려놔서 세션시간이 지나가면 유저정보가 필요없게되기때문에 정보를 날리는데 ....? 암튼 뭐시기 principal이다. principal객체안에서 꺼내쓸수 있는데 이걸 jsp에서 간단하게 유저정보를 올릴수있다.(나중에 또 쓰고 배움)

 

.xml을 위처럼 수정.

[SecurityController.java]
    @GetMapping("/admin")
	public void doAdmin() {

		log.info("admin only");
	}
[admin.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>/sample/admin page</h1>


<p>principal : <sec:authentication property="principal"/></p>
<%-- <p>MemberVO : <sec:authentication property="principal.member"/></p>
<p>사용자이름 : <sec:authentication property="principal.member.userName"/></p> --%>
<p>사용자아이디 : <sec:authentication property="principal.username"/></p>
<%--<p>사용자 권한 리스트  : <sec:authentication property="principal.member.authList"/></p>--%>


<a href="/customLogout">Logout</a>


</body>
</html>

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

마이바티스에서 1:n 처리 방법(join)

sql문은
select * from emp e, dept d where e.deptno=d.deptno;
이렇게만 처리하고 1:n관계인지 여부는 얘가 알수 없음
우리만 앎

설계랑 sql문은 전혀 관련없어서 1:n관계는 우리가 알아서 만들어줘야한다.

첫번째 방법 조인이고 나발이고 컬럼 전부 다 가져와서 VO에 넣어주기

두번째방법 마이바티스가 공식적으로 제공해주는 assosiation, collection쓰기


 

 

오늘의 문제

1.v4 템플릿을 적용하여, 카카오 로그인을 구현하시오.

 

 

 

728x90

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

21.02.19 [061] Fri  (0) 2021.02.19
21.02.18 [060] Thu  (0) 2021.02.18
21.02.16 [058] Tue  (0) 2021.02.16
21.02.15 [057] Mon  (0) 2021.02.15
21.02.10 [056] Wed  (0) 2021.02.10

댓글