어드민엘티이 타일즈에 적용해보자
일단 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

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 를 만들거임


아까 매니저에서 토큰쓴다한거... 기억
디비에서 가져오는내용은 유저디테일이 잡음

(인증서 로그인할떄는 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;
}
프로바이더등록시 셋메서드인자를 프로퍼티에준다

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

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

멤버꺼내서
그걸세션에심는거임


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


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"/>