<security:logout logout-url="/logout"/>
스프링에서 공통으로 사용하는 url
<security:intercept-url pattern="" access=""/>
사용자가 어떠어떠한 패턴으로 요청을햇을때
권한을 부여하는 부분
policy!
<security:intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/>
/admin/~~ url
관리자 권한으로 접근을 하면
"hasRole('ADMIN')" : 권한이 ADMIN인 사람만 접근을 가능하게 하라!
RLOE이 ADMIN인 사람만 접근을 가능하게 하라는 이야기
<security:intercept-url pattern="/user/mypage" access="hasAnyRole('ADMIN','USER')"/>
여러 롤들을 지정할때는 hasAnyRole 필요할때는 컴마 찍어서 지정해주면 된다
자기와 관리자만 접근이 가능하도록
permitAll() : url이 가장 길게 올라와있는거 부터 올려라 패턴이 긴쪽부터 위로 올려야만이
내가 원하는대로 적용이 됌!!!!!!
<security:http auto-config="true" use-expressions="true">
use-expressions : 를 설정 해주지 않으면 hasRole함수가 실행이 되지않는다
이 항목은 기본값으로 포함이된다.
<security:logout logout-url="/logout" logout-success-url="/" invalidate-session="true"/>
로그아웃이 되면 제일 처음 화면으로 가고, session을 삭제하라고 true라고 작성!
스프링 폼태그는 <form:form>
스프링 security에서 보낸 토큰을 자동으로 hidden으로 넣어준다
만약 스프링폼태그하지 않으면 반드시 토큰을만들어줘야함
프론트랑 버무리다 보며는 문제가 생길수가잇음
만약 내가 포스트에 토큰을 쓰는걸 안하고싶다
하면
이걸 트루로 바꿔주고
하지만 우리는 false로 쓸 것이다 기본값으로!!
이게 더 보안에 강하고 안정!
사용하지않는것을 true로 하겠다
사용하겠다는거를 false로 하겠다!!!!!
<!-- security:csrf의 disable 속성을 true로 설정하면 -->
<!-- POST 전송시 Token을 첨부하지 않아도 사용가능하도록 한다 -->
<!-- 단, 이 방법은 다른 API와 연동할때를 제외하고 -->
<!-- 사용하지 않는 것이 좋다 -->
<!-- 기본값은 항상 disabled="false"로 설정한다 -->
<security:csrf disabled="false"/>
<bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
<constructor-arg value="4" index="0"/>
</bean>
자체적으로 salt를 생성하고 암호화 문자를 만들어내는것
value숫자는 뭐냐면 내부에서 몇번 반복해서 암호문을 만들래? 히는것
10의 4승?정도된대
4번이아니라
기본 값은 4임 이걸 생략하면 오류가나서 넣어주는 것 뿐임
값이 커지면커질수록 클래스를 만드는데 시간이 엄청 걸린당~
BCrypt까지 치고 ctrl + space 하면 두번째꺼루 선택!!
이것도 따로 만들어줌 스캔하는 시점을 좀 바꿔준거
서비스 패키지는 서블릿에서 스캔하는 친구
atho는 컨텍스트에서 스캔하는 친구
그래서 auth에 두번 스캔이된다 별상관없음
걍 검색만 되는거임
>> security-context.xml
spring security project에서 form에 method=POST로 설정할 경우
반드시 ${_csrf.parameterName}을 name으로 하고
${_csrf.token}을 value로 하는 input box를 포함해야만 한다.
spring security 5.x에서는 ${_csrf.parameterName}은 _csrf라는 문자열일 뿐이지만
input name ="_csrf" 라고 사용하지 않는다.
security version에 따라 name 변수명이 다르기 때문이다.
spring security에서 logout
spring security에서는 logout을 반드시 POST method로 요청을 해야 한다.
*/%>
<form action="${rootPath}/logout" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
<button>로그아웃</button>
</form>
로그아웃할때는 메소드가 반드시 포스트여야함
>> logout.jsp
user디테일서비스는 context.
mybatis자체를 컨텍스트영역으로 옮겨서 사용하겠다.
마이바티스가 다행히 서블릿까지 잘 신호가감
서블릿에서 빼주고 스프링 폴더로 이동함!
이게 context영역으로 옮겨준거임~
<!-- mybatis-context.xml을 servelt영역에서 context영역으로 이동
spring security UserDetailService에서
Dao, mapper 등을 필요로 하기 때문에
일반적인 프로젝트에서는 기존처럼 servlet영역에 설정을 하면되지만
spring security에서 DB로부터 사용자 정보를 조회하는 기능을 사용하려면
mybatis-context가 context영역에 있어야한다.
param-value를 설정할 때 *-context.xml로 할 수 있다
그런데 *-context.xml로 설정을 하면
각 xml 파일이 읽어지는 시점이 미묘하게 흐트러져
bean을 서로 찾지 못하는 문제가 발생할 수 있다. -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/mybatis-context.xml //여기에서 만들어진 다오를
아래 코드가 가져가서 사용해야한다.
근데 별표로하면 누가먼저 읽어질지 모름
//문법은 틀리지않지만
서블릿은 문제가 아직까지 없었지만
context-param은 순서의 미묘한 차이때문에
오류가 발생할 가능성이 있다.
그래서 이렇게 순서대로 작성을 해준다!!!
/WEB-INF/spring/security-context.xml
/WEB-INF/spring/root-context.xml
</param-value>
</context-param>
>> web.xml
여섯개의 변수는 이름을 똑같이 만들어줘야한다!!!
우리는 보통 enabled만 해줌
그리고 getter, setter가 필수
이렇게 vo를 만들어주고
security-context.xml에 여러가지 설정해주고
security-context.xml 우리가 만든게 거의 공식이라고 보면 된다!!
실무에서 사용되는 정도도 보통 이정도랭
얘를 생성하기 위해서 생성자를 호출했는데 생성자가 없다라고 오류가 남
우리는 생성자를 쓴 적이 없는데
그걸 해주는게 @ModelAttribute가 대신해줌
Vo vo = new vo() 이걸 대신해준다고!!! 모델어트리뷰트가
>> MemberController
>>UserDetailVO & user-mapper.xml