728x90
반응형

 

CentOS 서버에 jdck 1.8 을 설치하였고, Tomcat 9 버전도 같이 설치하였습니다.

 

tomcat 을 실행하는 순간 아래와 같은 오류가 발생하였습니다.

failed /usr/java/jdk1.8.0_202/jre/lib/i386/server/libjvm.so, 
because /usr/java/jdk1.8.0_202/jre/lib/i386/server/libjvm.so: 
cannot restore segment prot after reloc: Permission denied

 

 

 

 

터미널에서 아래 명령을 실행하여 SELinux를 비활성화 합니다.

/usr/sbin/setenforce 0

 

 

 

 

SELinux를 활성화 하려면 아래 명령을 실행합니다.

/usr/sbin/setenforce 1

 

 

 

 

원하는 명령을 실행한다음 Confluence를 다시 시작합니다.

 

원하는 오류는 없어졌지만 서버 설정은 너무나 많은 정보로 뭉쳐져 있기에 어려움이 많은것 같습니다.

 

그래도 열심히 정리를 하도록 하겠습니다.

 

728x90
반응형

'프로그래밍 > Server' 카테고리의 다른 글

[CentOS] yum open jdk 설치  (0) 2019.07.16
[Tomcat] JAVA_HOME 수동 설정  (0) 2019.06.18
[WebtoB] Log Directory  (0) 2019.04.15
[WebtoB] config Directory  (0) 2019.04.15
[WebtoB] Directory 구조  (0) 2019.04.15
728x90
반응형

 

Spring Boot security 를 구현하여 로그인, 로그아웃을 처리하고 있습니다.

 

고객이 로그아웃을 할때에 기록을 남겨 달라는 고객사의 요청이 있었습니다.

 

Security 를 사용할때 편하게 Session이 소멸시점을 체크할 수 있는 방법을 알아보겠습니다.

 

 

 

 

Security 설정에서 logout 을 세션을 초기화하는 코드를 작성합니다.

.and().logout()
      .logoutUrl("/logout")
      .logoutSuccessUrl("/login")  // 로그아웃 성공시 메인 고정
      .invalidateHttpSession(true)    // session invalidate
      .deleteCookies("JSESSIONID")	// cookie
      .permitAll()

 

 

 

Member Entity 입니다.

@Data
@Entity
@Table(name = "테이블")   // 회원 테이블
public class Member implements UserDetails {

	...
    
    /************************************
        UserDetails Override functions
     ************************************/
    /**
     * 사용자에게 부여된 권한
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
    	Set<GrantedAuthority> roles = new HashSet<>();
		role.forEach(e -> {
    		roles.add(new SimpleGrantedAuthority(e.getValue()));
    	});
    	return roles;
    }

    /**
     * 사용자 인증에 사용된 암호
     */
    @Override
    public String getPassword() {
        return memberPw;
    }

    /**
     * 사용자 인증에 사용된 이름
     */
    @Override
    public String getUsername() {
        return memberId;
    }

    /**
     * 사용자 계정 만료 여부
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 사용자가 잠김 여부
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 사용자의 자격증명(암호)이 만료 여부
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 사용자의 사용가능여부
     */
    @Override
    public boolean isEnabled() {
        return true;
    }
}

 

 

 

 

 

session 이 소멸하게 되면 아래의 listener 로 진입합니다.

 

SessionDestroyedEvent를 implemets 하면 security 로그인했던 사용자 정보를 담아두고 있습니다.

 

사용자는 UserDetails 를 상속받거나 User를 구현했다면 정보를 조회할 수 있습니다.

 

이때는 request 가 없기 때문에 필요한 정보는 미리 UserDetails 에 넣어둔 뒤 소멸되는 시점에 기록을 남기면 됩니다.

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.session.SessionDestroyedEvent;
import org.springframework.stereotype.Component;

import com.kcknock.primary.domain.Member;
import com.kcknock.primary.domain.MemberState;
import com.kcknock.primary.repository.MemberStateRepository;

/**
 * sessionDestroyed 요청시
 * @author gigas
 */
@Component
public class SessionDestroyListener implements ApplicationListener<SessionDestroyedEvent>{

	@Autowired
	private MemberStateRepository memberStateRepository;
	
	@Override
	public void onApplicationEvent(SessionDestroyedEvent event) {
		List<SecurityContext> securityContexts = event.getSecurityContexts();

        for (SecurityContext securityContext : securityContexts) {
        	
        	Member member = (Member)securityContext.getAuthentication().getPrincipal();
        	
        	MemberState memberState = new MemberState();
        	memberState.setMemberId(member.getMemberId());
        	memberState.setType("로그아웃");
//        	memberState.setDevice("");
//        	memberState.setIpAddr("");
//        	memberState.setOs("");
        	
        	memberStateRepository.save(memberState);
        }
	}
}

 

 

 

 

소멸시점을 check 하는것처럼 생성시점도 아래와 같이 확인할 수 있습니다.

@Component
public class SessionCreateListener implements ApplicationListener<SessionCreationEvent> {

	@Override
	public void onApplicationEvent(SessionCreationEvent event) {
    
    }
}

 

 

 

 

이와같은 코드를 작성하면서 세션이 초기화되면 자동로그아웃을 구현해야겠다는 생각이 들었습니다.

 

하지만 찾아본 결과로는 해당 session 을 처리하는 곳에선 request 정보가 없기때문에 처리가 어렵다는 글들이 많던데..

 

최대한 '자동로그아웃' 기능을 찾아서 글로 남겨보도록 하겠습니다.

728x90
반응형
728x90
반응형

 

웹에서 자주 다루던 '아이디 기억하기' 를 해보려고 했던적이 있는데. 간단한 코드인데도 동작을 안하고.. 몇줄이나 따라서 썻지만 안되면 다 지우고 했던적이 한두번이 아닙니다.

 

찾다보니 간단하게 cookie를 사용할 수 있도록 jquery 에서 지원하는 plugin을 찾았습니다.

 

다운로드는 아래 url로 이동해서 받으면 됩니다.

 

https://plugins.jquery.com/cookie/

 

jQuery Cookie | jQuery Plugin Registry

jQuery Cookie by Klaus Hartl A simple, lightweight jQuery plugin for reading, writing and deleting cookies. Versions Version Date 1.4.1 Apr 27 2014 1.4.0 Oct 5 2013 1.3.1 Jan 25 2013 1.3.0 Jan 24 2013

plugins.jquery.com

 

 

 

 

요즘은 웹 cookie를 잘 사용하지 않고 기본적으로 javascript 에서 지원하기 때문에 version이 올라가지 않습니다.

 

Download now 를 클릭하여 다운로드를 받습니다.

 

 

Jquery 와 함께 load

다운로드를 받았다면 아래와같이 코드에 script를 불러옵니다.

<script type="text/javascript" src="https://code.jquery.com/jquery-x.x.x.min.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>

 

 

Cookie 생성

// 세션 쿠키 생성 - 브라우저를 종료하면 소멸
$.cookie('name', 'value'); 

// 7일 뒤에 만료되는 쿠키 생성 
$.cookie('name', 'value', { expires: 7 }); 

// 전체 사이트에 대해 7일 뒤에 만료되는 쿠키 생성 
$.cookie('name', 'value', { expires: 7, path: '/' });

 

 

Cookie 조회

// key로 cookie 조회
$.cookie('name'); 

// {key: value} 형태의 모든 쿠키 반환
$.cookie();

 

 

Cookie 제거

// 기본 cookie 제거 방법
// 성공여부에 따른 boolean 값을 반환
$.removeCookie('name'); 

// domain 설정
$.cookie('name', 'value', { path: '/' }); 

// domain을 설정시 cookie 제거방법
$.removeCookie('name', { path: '/' });

 

간단하게 사용하는 방법을 알아보았습니다.

 

728x90
반응형

+ Recent posts