카테고리 없음

0315 오후수업

unemo 2021. 3. 15. 15:02
반응형

어드민엘티이 타일즈에 적용해보자

일단 pom.xml

 

  <!-- spring-security -->      
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-web</artifactId>
         <version>${org.springframework-security}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-config</artifactId>
         <version>${org.springframework-security}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-taglibs</artifactId>
         <version>${org.springframework-security}</version>
      </dependency>

근데 커플드가 잇음

얘들이 같이들어와서 기존의 녀석들이랑 겹침
이건 아까 예시의 메이븐이고

우리 어드민엘티이에는 저것들이 이미있어서 겹침 -> 터짐

그래서 태그라이브러리 가져올떄 시큐리티에 excludes해줘야함

 

 <dependency>
         <groupId>org.springframework.security</groupId>
         <artifactId>spring-security-taglibs</artifactId>
         <version>${org.springframework-security}</version>
         <exclusions>
         	<exclusion>
         		<groupId>org.springframework</groupId>
         		<artifactId>spring-jdbc</artifactId>
         	</exclusion>
         	<exclusion>
         		<groupId>org.springframework</groupId>
         		<artifactId>spring-tx</artifactId>
         	</exclusion>
         </exclusions>
      </dependency>

 

이제 설정을 해야함

시큐리티컨텍스트

 

 

 

<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-3.2.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

security로 기본 바꾸고

 

has authority : 하나하나 세부적인 권한

has role : 역할

 

둘다 뭘쓰던상관이없는데 권한에 대한 차별화? 그냥 상징적인 거임

 

has any role : 여러개를 한번에 줄수잇따.

 

	<http use-expressions="true" pattern="/**">
		<intercept-url pattern="/**/regist*" access="hasAnyRole('ROLE_ADMIN,ROLE_MANAGER')"/>
		<intercept-url pattern="/**/modify*" access="hasAnyRole('ROLE_ADMIN')"/>
		<intercept-url pattern="/**/stop*" access="hasAnyRole('ROLE_ADMIN')"/>
		<intercept-url pattern="/**/remove*" access="hasAnyRole('ROLE_ADMIN')"/>
		
		<intercept-url pattern="/index.do**" access="isAuthenticated()"/>
		<intercept-url pattern="/member/**" access="isAuthenticated()"/>
		<intercept-url pattern="/notice/**" access="isAuthenticated()"/>
		<intercept-url pattern="/board/**" access="isAuthenticated()"/>
		<intercept-url pattern="/pds/**" access="isAuthenticated()"/>
		<intercept-url pattern="/replies/**" access="isAuthenticated()"/>
		
		<intercept-url pattern="/**" access="permitAll"/>
		<form-login/>
		<logout/>
	</http>

 

여기에없는 유알엘은 시큐리티적용이안됨

메인페이지 무조건 로그인해야들어올수잇다.

 

 

common controller

저거없으면 denied된 페이지가 200으로 나옴>ajax 에서 success로 간다는말! security/accessDenied로 포워딩하긴할건데 오류코드는 302로

302이면 리다이렉트라는 의미라 로그인화면으로 돌려버리려고함

근데 로그인쪽의 302인지 디나이쪽의 302인지 구분해야하므로

그걸 구분하는 파라미터가 따로있음

@RequestMapping("/security/accessDenied")
	public String accessDenied(HttpServletResponse response) {
		String url  ="security/accessDenied";
		response.setStatus(302);
		return url;
	}

 

 

jsp 만들어야함

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<script>
	alert("권한이 없습니다.");
	if(window.opener){
		window.close();
	}else{
		history.go(-1);
	}
</script>

 

스크립트 날리면서 응답코드는 302이고 열린화면이면 닫고, 아니라면 뒤로뺵

 

로긴화면보낼떄 그냥로그인이냐 로긴없이어디가다가잡힌거냐-> error

이 파라미터 누가받음? 컨트롤러한테 던짐 이걸 구분하면됨

 

이제 로그인컨트롤러는필요없다

이제 서블릿은 login.do 를 받을수없게되기떄문 (시큐리티가 먼저 가로채니까)

	<form-login login-page="/common/loginForm.do?error=1"
					login-processing-url="/common/login.do"
					username-parameter="id"
					password-parameter="pwd"
					default-target-url="/index.do"
		/>
		<logout		logout-url="/common/logout.do"
					invalidate-session="true"
					logout-success-url="/"
					delete-cookies="JSESSIONID"		
		/>

로그아웃에서하는거 세션날리고: invalidate-session  첫화면으로 돌리는거 : logout seccess

 

시큐리티적용하면

서버껏다켜도로ㄱ,아웃안됨

물론 세션은 날라가지만 시큐리티는 통과함

그래서 이게 싱크가맞도록 연결을 해야함 (provide쪽에서)

logoutsuccesshandler에서 뭔가해야함

 

common 컨트롤러 이거 필요없음 (밑에 로그아웃도)

메서드다른데??

->필터는 메서드를 구분하지않는다.

필터는 httpservlet리퀘스트가 아니라 그냥 servlet리퀘스트이기떄문에/...

그래서 로긴화면보여주는 url과 로긴처리유알엘이 겹치면 절대 안된다

 

그리고 

여기는 .do 생략되면 안됨 핸들러매퍼에 올라가는 유알엘만 생략가능하므로

 

이것만으로 처리가능? no

이걸하나도안햇음

authehentication provider 를 만들거임

 

 

 

아까 매니저에서 토큰쓴다한거... 기억

디비에서 가져오는내용은 유저디테일이 잡음

 

Authentication의 종류 엄청 많다 어던 형식으로 인증을 할꺼냐의 종류. 우린 맨마지막 username 과 pwd 사용하는 것

(인증서 로그인할떄는 key를 가지고 하는 0auth어쩌고를 써야함)

 

 authentication이 이렇게 형식이 많으니 첫번쨰 매서드는 제일 최상위객체인ㅇ authentication의 타입을 딱정해주는게 support 메서드임

 

 

인증의 방식(아이디와패스워드로하겟다)을 결정

이걸 프로바이더가 매니저에게 넘겨주면

매니저가 이걸가지고 계속 운영하는거임

 

package kr.or.ddit.security;

import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;

public class CustomAuthenticationProvider implements AuthenticationProvider {

	@Override
	public Authentication authenticate(Authentication authentication) throws AuthenticationException {
		return null;
	}

	@Override
	public boolean supports(Class<?> authentication) {
	/*usernamePass~token리턴할떄 파라미터와 같은 레퍼런스인지 비교를 하고 리턴을 한다. default-target-url로 전송된다*/
		return authentication.equals(UsernamePasswordAuthenticationToken.class);
	}

}

 

 

아이디패스워드 끌고와야함 (사용자가 준거랑 디비에잇는거랑 비교할거임)

 디비긁어와야하므로 dao 필요

private MemberDAO memberDAO;
	
	public void setMemberDAO(MemberDAO memberDAO) {
		this.memberDAO = memberDAO;
	}

 

프로바이더등록시 셋메서드인자를 프로퍼티에준다

꺼낼때는 사용자가 준 id, pwd 이고 지난다음엔 로그인에 성공한 id,pw가 된다.

 

 

에러들은 핸들러까지 넘어가게됨

 

저심은게 석세스핸들러까지가고 거기서 심은거

 

멤버꺼내서

그걸세션에심는거임

 

리턴 하고 안하고 차이. 

 

 

유저클래스만들거임

멤버vo를 갖고잇는 유저처럼 만들거임

 

authority를 간단하게 스트링으로 만들수있는애

 

 

여기서 하ㄹ나라도 false면 로그인이안됨

state라 쳣을ㄷ떄 5이면 기간만료 4면 휴면계정 ... 등

 

저 4개가 다 트루여야 로그인가능한 환경임

근데 마지막은 긍정비교라 위에 3개는 부정비교여야함

1이면 무조건로그인됨

package kr.or.ddit.security;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import kr.or.ddit.dto.MemberVO;

public class User implements UserDetails{//userdetails: 시큐리티에잇느녀석
	//user정보는 껍데기일뿐 알맹이는 memberVO
	private MemberVO member;
	public User() {	};
	public User(MemberVO member) {
		this.member = member;
	}

	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {//멤버가가진권한들을내뱉어줌. 멤버vo가 가지고잇음
		List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
		
		roles.add(new SimpleGrantedAuthority(member.getAuthority()));
		
		return roles;
	}

	@Override
	public String getPassword() {
		return member.getPwd();
	}

	@Override
	public String getUsername() {
		return member.getId();
	}

	@Override
	public boolean isAccountNonExpired() {
		return member.getEnabled()!=4;
	}

	@Override
	public boolean isAccountNonLocked() {
		return member.getEnabled()!=3;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		//인증만료가 아니냐? >true : 인증정보가완료되지않앗다는뜻 즉 사용가능
		//false일때 사용불가능인거임
		return member.getEnabled()!=2;
	}

	@Override
	public boolean isEnabled() {// 탈퇴혹은 삭제 //탈퇴시 0
		return member.getEnabled()==1;
	}
	
	public MemberVO getMemberVO() {
		return this.member;
	}

}

 

 

시큐리티컨택스트에 프로바이더걸어줘야함

걸어주려면 빈등록해야함

	<!-- 인증 -->
	<authentication-manager>
		<authentication-provider ref="authenticator"/>
	</authentication-manager>
	
	<beans:bean id="authenticator"
				class="kr.or.ddit.security.CustomAuthenticationProvider"
				p:memberDAO-ref="memberDAO"
	/>

 

 rootcontext에 임포트

<import resource = "./security-context.xml"/>	

 

 

 

 

 

반응형