728x90
security-context.xml 전체코드
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
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">
<!-- xmlns:security는 스프링 시큐리티가 제공하는 XML 네임스페이스를 활성화 -->
<!-- 인가 (authorization) 불허
bean : 객체 / class="우리가 만든 클래스 / id : 우리가 만든 클래스를 인스턴스화 하여 만든 객체면
-->
<bean id="customAccessDenied"
class="kr.or.ddit.security.CustomAccessDeniedHandler"></bean>
<!-- 로그인 성공 처리
로그인 성공 후 이력 로그를 기록(DB, 파일)과 같은 작업을 하고자 할 때 사용
-->
<bean id="customLoginSuccess"
class="kr.or.ddit.security.CustomLoginSuccessHandler">
</bean>
<!-- 사용자가 정의한 비밀번호 암호화 처리기를 빈(객체)으로 등록 -->
<bean id="customPasswordEncoder"
class="kr.or.ddit.security.CustomNoOpPasswordEncoder"></bean>
<!-- 스프링 시큐리티의 UserDatailsService를 구현한 클래스를 빈(객체)으로 등록 -->
<bean id="customUserDetailsService"
class="kr.or.ddit.security.CustomUserDetailsService"></bean>
<security:http>
<!-- 접근 제한 설정 : 시큐리티 설정을 통해서 특정 URI에 대한 접근을 제한할 수 있음
Role : 권한 / hasRole : 권한을 갖고있니?
permitAll : 누구나 접근 가능
스프링 시큐리티 에너테이션
- 스프링 시큐리티는 에너테이션을 사용하여 필요한 설정을 추가할 수 있음
-
-->
<!-- <security:intercept-url pattern="/freeboard/list" access="permitAll"/> -->
<!-- <security:intercept-url pattern="/freeboard/register" access="hasRole('ROLE_MEMBER')"/> -->
<!-- <security:intercept-url pattern="/notice/list" access="permitAll"/> -->
<!-- <security:intercept-url pattern="/notice/register" access="hasRole('ROLE_ADMIN')"/> -->
<!-- 폼 기반 인증 기능 사용 -->
<!-- <security:form-login/> -->
<!-- 사용자가 정의한 로그인(인증 : authentication) 페이지의 URI를 지정 -->
<!-- <security:form-login login-page="/member/loginMember"/> -->
<!-- 인증 성공 시 처리해줄 클래스의 인스턴스 명 작성 -->
<security:form-login login-page="/member/loginMember"
authentication-success-handler-ref="customLoginSuccess"/>
<!-- <sec:csrfInput/> 생략가능 -->
<security:csrf disabled="true"/>
<!-- 1. 접근 거부 처리(사용자 정의)
접근 거부가 발생한 상황에 단순 메시지 처리 이상의 다양한 처리를 하고 싶다면
AccessDeniedHandler를 직접 구현해야 함
-->
<security:access-denied-handler ref="customAccessDenied"/>
<!-- 자동 로그인
로그인하면 특정 시간 동안 로그인 할 필요가 없는 기능,
dataSource(root-context.xml)를 통해 지정한 데이터베이스의 약속된 테이블(PERSISTENT_LOGINS)을
이용하여 기존 로그인 정보를 기록함
token-validity-seconds : 쿠키의 유효시간(초). 604800초는 7일
-->
<security:remember-me data-source-ref="dataSource"
token-validity-seconds="604800"
/>
<!--
1. 접근 거부 처리(시큐리티 제공)
1) 선제조건 : 계정 / 비밀번호가 맞아야 함 -> 로그인 가능
2) 들어가려는 URL에 대한 권한이 없어야 함
/notice/register 요청에 member / java로 로그인 한 경우[ROLE_MEMBER]
-->
<!-- <security:access-denied-handler error-page="/security/accessError" /> -->
<!-- 로그아웃 처리. 로그아웃 후에 세션을 무효화 함-->
<security:logout logout-url="/logout" invalidate-session="true"
delete-cookies="remember-me,JSESSION_ID" />
</security:http>
<!--
authentication: 인증(로그인)
authorization: 인가(로그인 후의 권한)
authorities: 권한들
로그인 처리.
메모리상에 아이디와 패스워드를 지정하고 로그인을 처리함
스프링 시큐리티(5.0.7.RELEASE버전) 5버전부터는 패스워트 암호화 처리기를 반드시 이용해야 함
암호화 처리기를 사용하지 않으려면 noop 문자열을 비밀번호 앞에 사용함
-->
<security:authentication-manager>
<security:authentication-provider user-service-ref="customUserDetailsService">
<!-- DB 사용을 위해 dataSource(root-context.xml)를 지정함
<security:jdbc-user-service data-source-ref="dataSource"/> -->
<!--
users-by-username-query : 인증할 때 사용될 쿼리
authorities-by-username-query : 권한을 확인할 때 사용될 쿼리
-->
<!-- <security:jdbc-user-service data-source-ref="dataSource" -->
<!-- users-by-username-query="SELECT USER_NO, USER_PW, ENABLED FROM MEMBER2 WHERE USER_NO = ?" -->
<!-- authorities-by-username-query="SELECT A.USER_ID,B.AUTH -->
<!-- FROM MEMBER2 A, MEMBER2_AUTH B -->
<!-- WHERE A.USER_NO = B.USER_NO -->
<!-- AND A.USER_NO = ? "/> -->
<!-- 사용자가 정의한 비밀번호 암호화 처리기를 지정함 -->
<security:password-encoder ref="customPasswordEncoder"/>
<!-- <security:user-service> -->
<!-- <security:user name="member" password="{noop}java" -->
<!-- authorities="ROLE_MEMBER"/> -->
<!-- <security:user name="admin" password="{noop}java" -->
<!-- authorities="ROLE_ADMIN"/> -->
<!-- </security:user-service> -->
</security:authentication-provider>
</security:authentication-manager>
</beans>
<!-- <security:intercept-url pattern="/freeboard/list" access="permitAll"/> -->
<!-- <security:intercept-url pattern="/freeboard/register" access="hasRole('ROLE_MEMBER')"/> -->
<!-- <security:intercept-url pattern="/notice/list" access="permitAll"/> -->
<!-- <security:intercept-url pattern="/notice/register" access="hasRole('ROLE_ADMIN')"/> -->
이부분 주석
servelet-context에
xmlns:security="http://www.springframework.org/schema/security" 추가
xsi:schemaLocation에도
http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security-4.2.xsd
추가해준다
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security-4.2.xsd
">
밑에다 이것도 추가
<!-- 스프링 시큐리티 에너테이션을 활성화
-pre-post-annotations="enabled" => 골뱅이PreAuthorize, 골뱅밍 PostAuthorize활성화
***골뱅이 PreAuthorize : 특정 메소드를 실행하기 전에 role(권한) 체킹
골뱅이PostAuthorize : 특정 메소드를 실행한 후에 role(권한) 체킹
-secured-annotations="enabled" => 골뱅이 Security를 활성화
Secured : 스프링 시큐리티 모듈을 지원하기 위한 에너테이션
-->
<security:global-method-security pre-post-annotations="enabled"
secured-annotations="enabled" />
이건 전체코드
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/security https://www.springframework.org/schema/security/spring-security-4.2.xsd
">
<!-- servlet-context.xml : 스프링 웹(view) 설정 파일
뷰(JSP 웹 페이지)와 관련 있는 빈(bean) 객체를 설정함. 즉, 컨트롤러, MultipartResolver, Intercepter, URI와
관련 설정을 담는 클래스를 설정함
골뱅이Controller, 골뱅이RequestMapping과 같은 애너테이션을 사용 시 필요한 빈(bean) 객체들을 자동으로 등록함
핸들러 어댑터의 빈(bean) 객체도 대신 등록함
-->
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<!-- static folder설정(정적 폴더 설정)=> css, images, upload, js
서버에서 앞서 처리될 필요가 없는 정적 리소스 파일을 처리하는 역할 수행
웹 애플리케이션의 물리적 경로 이름을 설정하고 이 경로에 정적 리소스 파일들을 저장하면
소스 코드나 웹 브라우저의 주소창에서 해당 리소스의 경로를 사용하여 직접 접속할 수 있음
정적 리소스란 클라이언트에서 요청이 들어왔을 때 요청 리소스가 이미 만들어져 있어 그대로 응답하는 것
mapping : 웹 요청 경로 패턴을 설정. 컨텍스트 경로를 제외한 나머지 부분의 경로와 매핑
location : 웹 애플리케이션 내에서 실제 요청 경로의 패턴에 해당하는 자원 위치를 설정, 위치가 여러 곳이면 각 위치를 쉼표로 구분
-->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<!-- setOrder("2") => tiles를 작동한 후에 ViewResolver를 작동하겠다라는 의미 -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
<beans:property name="order" value="2" />
</beans:bean>
<!-- Tiles 설정 시작 -->
<beans:bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<beans:property name="definitions">
<beans:list>
<beans:value>/WEB-INF/spring/tiles-config.xml</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<!-- UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver() -->
<beans:bean id="tilesViewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<beans:property name="viewClass"
value="org.springframework.web.servlet.view.tiles3.TilesView" />
<beans:property name="order" value="1" />
</beans:bean>
<!-- Tiles 설정 끝 -->
<!-- 스프링 시큐리티 에너테이션을 활성화
-pre-post-annotations="enabled" => 골뱅이PreAuthorize, 골뱅밍 PostAuthorize활성화
***골뱅이 PreAuthorize : 특정 메소드를 실행하기 전에 role(권한) 체킹
골뱅이PostAuthorize : 특정 메소드를 실행한 후에 role(권한) 체킹
-secured-annotations="enabled" => 골뱅이 Security를 활성화
Secured : 스프링 시큐리티 모듈을 지원하기 위한 에너테이션
-->
<security:global-method-security pre-post-annotations="enabled"
secured-annotations="enabled" />
<!-- kr.or.ddit 패키지를 컴포넌트 스캔 대상으로 함
-->
<context:component-scan base-package="kr.or.ddit" />
</beans:beans>
시큐리티 컨트롤러에 주석달아줌
//요청URI : /freeboard/register
//회원게시판의 등록
//로그인한 회원 중에서 ROLE_ADMIN 또는 ROLE_MEMBER 권한을 갖는 경우 접근 가능
//골뱅이PreAuthorize("hasRole('ROLE_ADMIN','ROLE_MEMBER')")
//골뱅이Secured({"ROLE_ADMIN","ROLE_MEMBER"})
@PreAuthorize("hasRole('ROLE_MEMBER') or hasRole('ROLE_ADMIN')")
@GetMapping("/freeboard/register")
public String freeboardRegister() {
//forwarding
return "freeboard/register";
}
//요청URI : /notice/list
//공지사항 게시판의 목록
//누구나 접근 가능 -> ROLE_MEMBER 권한 또는 ROLE_ADMIN 권한에 상관없이 로그인 한 경우만 접근 가능
@PreAuthorize("isAuthenticated()")
@GetMapping("/notice/list")
public String noticeList() {
//forwarding
return "notice/list";
}
//요청URI : /notice/register
//공지사항 게시판의 등록
//로그인한 관리자만 접근 가능
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/notice/register")
public String noticeRegister() {
//forwarding
return "notice/register";
}
'Spring > Spring 기초' 카테고리의 다른 글
SVN설치방법 (0) | 2023.08.22 |
---|---|
e7e샘의 초간단 웹소켓 (0) | 2023.08.18 |
시큐리티 자동로그인 구현 (0) | 2023.08.18 |
스프링 시큐리티 표현식 (0) | 2023.08.18 |
Security 폼 기반 인증 기능 사용(로그아웃 처리) (0) | 2023.08.17 |