반응형

 

 

 

금요일 방문한 소고기 무한리필 소도둑!!!!!
무려 소도둑!!!!!

위치는 양재역 또는 양재 시민의 숲역에서 가는데 숲역이 더 가깝네요
[식사 후 숲도 한번 방문해서 소화까지 고고 ㅋㅋ ㅋㅋ ㅋ]

 

 

 

가게 입구 사진을 못 찍어서 로드뷰 캡처를 뽭!~~~

 

주차는 사진으로는 2개인데..꽉 채우면 4대 정도 주차가 가능하다니 좋네요~

 

 

 

저희는 소무한 기본으로 주문!!

 

 

와인도 있었는데..저희 소주 맥주를 주문했구요
테슬라를 만들어볼까 하다가 테라,진로 시켰어요 이 조합도 괜찮네요~~

 

 

기본으로 나오는 소 모듬이에요 갠적으론 호주산 선호하긴 하지만 미국산인데 맛은 괜찮아요.

부챗살 갈빗살 토시살 척아이롤 다 맛남 냠냠..ㅎㅎ

 

 

여기는 셀프코너이고 백김치가(!!) 꽤 맛있었다는... 사진에는 없지만 오른쪽에 음료수 코너가 !
1인당 2000원에 무한인데 저희는 안 먹었어요
(고기를 먹어줘야 하니까요 ㅋ ㅋ ㅋ)

 

01

 

남자 3명이서 4번이나 리필해 먹었어요.
나름 선방했지요 ㅋㅋ

 

역에서 거리는 좀 있지만 2만원의 가성비가 좋았어요~
거리만 좀 가까우면 좋은데 조금 아쉽 ㅎㅎ
그래도 재방문 의사 있구요~
소고기 좋아하시는 분은 강추합니다!~~~

반응형

'먹거리' 카테고리의 다른 글

서울역 시집못간 돼지 연탄구이  (1) 2020.08.30
무삥과 팟타이(태국음식)  (0) 2020.08.28
사당역 쌀국수(하노이별)  (0) 2020.08.23
사당 파스타 리에또  (0) 2020.08.15
구로디지털단지 계림원  (0) 2020.08.13
반응형

개발코드를 그냥 복사해서 붙여버리면 일반 텍스트처럼 보이기 때문에 보는데 불편하여 코드 강조하는 syntaxhighlighter를 적용하려고 해요. 사이트 가서 받아도 되지만 첨부파일 받아오되요

syntaxhighlighter_3.0.83.zip
0.17MB

압축을 풀고 scripts, styles 두 개 폴더가 필요해요

먼저 스킨에 위 두개폴더 js, css파일을 업로드해야 해요

스킨 편집 이동 후

html 편집

추가를 클릭 한 다음에 script, css파일을 업로드해주면 돼요

업로드 완료 후 HTML탭에 가서

<script type="text/javascript" src="./images/shCore.js"></script>
<script type="text/javascript" src="./images/shLegacy.js"></script>
<script type="text/javascript" src="./images/shBrushBash.js"></script>
<script type="text/javascript" src="./images/shBrushCpp.js"></script>
<script type="text/javascript" src="./images/shBrushCSharp.js"></script>
<script type="text/javascript" src="./images/shBrushCss.js"></script>
<script type="text/javascript" src="./images/shBrushDelphi.js"></script>
<script type="text/javascript" src="./images/shBrushDiff.js"></script>
<script type="text/javascript" src="./images/shBrushGroovy.js"></script>
<script type="text/javascript" src="./images/shBrushJava.js"></script>
<script type="text/javascript" src="./images/shBrushJScript.js"></script>
<script type="text/javascript" src="./images/shBrushPhp.js"></script>
<script type="text/javascript" src="./images/shBrushPlain.js"></script>
<script type="text/javascript" src="./images/shBrushPython.js"></script>
<script type="text/javascript" src="./images/shBrushRuby.js"></script>
<script type="text/javascript" src="./images/shBrushScala.js"></script>
<script type="text/javascript" src="./images/shBrushSql.js"></script>
<script type="text/javascript" src="./images/shBrushVb.js"></script>
<script type="text/javascript" src="./images/shBrushXml.js"></script>
<link type="text/css" rel="stylesheet" href="./images/shCore.css">
<link type="text/css" rel="stylesheet" href="./images/shThemeEclipse.css">
<script type="text/javascript">
SyntaxHighlighter.all();
</script>

head에 추가하시면 돼요 전 이클립스 테마를 사용했어요

<pre class="brush: 언어">

String a;

</pre>

사용하시면 돼요.

 

만약 중간에 스킨을 변경을 하게 되면 <meta><script>등이 날아가기 때문에 변경 전 검색 태그나 그런 건 복사를 해두시고 스킨 변경을 하셔야 해요.

첨 설정을 했다가 스킨 변경으로 날려먹어 다시 설정을 했어요

반응형

'개발' 카테고리의 다른 글

이클립스에서 한글이 깨질경우  (3) 2020.12.20
톰켓 Symbolic link(Windows)  (0) 2020.10.27
spring security 중복 로그인 방지  (3) 2020.08.12
반응형

얼마전에 구로디지털단지 계림원이라는곳을 갔어요

1차로 고기를 먹고 2차로 삼통치킨을 가자고했는데 다들 싫어해서 찾다가 계림원 누룽지통닭 이라는곳을 갔어요

 

 

입구 사진한컷이고

 

 

 

입구에 들어가니 장작들이 보였어요

 

 

 

4명이서 1차를 하고왔기때문에 치즈콘닭에 생멱4잔을 시켰어요.

 

 

주문 후 5분정도 뒤에 콘닭이 나왔어요.

치즈먼저 먹고 그 다음 누룽지,콘 마지막으로 닭을 먹었어요.

닭은 옛날통닭 느낌이나 별로였지만 닭보다 치즈가 더 맛있어요. 그래서 다음에 온다고해도 치즈콘닭을 시켜야겠어요

2번 출구에서 5분정도면 갈수있어요

반응형

'먹거리' 카테고리의 다른 글

서울역 시집못간 돼지 연탄구이  (1) 2020.08.30
무삥과 팟타이(태국음식)  (0) 2020.08.28
사당역 쌀국수(하노이별)  (0) 2020.08.23
사당 파스타 리에또  (0) 2020.08.15
양재 소도둑  (1) 2020.08.15
반응형

오늘 오전에 알림이 와서 확인을 해보니 중국에서 ssh접근하여 로그인 시도가 확인이 되어 방화벽 설정을 하게되었어요

 

114.223.122.151 검색하니 중국으로 나와서 방화벽 설정을 하게되었어요

custome선택하고 규칙편집을 클릭하면

 

먼저 위치를 선택하고 선택한다음에 남한을 체크하고 확인을 눌러주세요

최종 셋팅된 상태에요

728x90

단 저렇게하니 폰으로 http://quickconnect.to 방화벽에 막히네요

 

집 컴퓨터로는 접속이 잘 되는거 확인이 되었어요 quic는 시놀로지 서버를 거쳐서 오는거라 막은거라 의심이 되네요

 

방법을 찾으면 블로그에 다시 남겨볼께요

반응형

'시놀로지' 카테고리의 다른 글

시놀로지 Moments 사진업로드  (0) 2020.08.21
시놀로지 Video Station(DS VIDEO)  (0) 2020.08.16
시놀로지 ssh root 접속  (0) 2020.08.11
시놀로지 NAS 설정  (0) 2020.08.11
시놀로지NAS(DS220+)구입기  (0) 2020.08.11
반응형

예전 사이트에 적용한 security를 사용한 중복 로그인 방지를 작성해 보려고 해요

 

요구사항

  • 관리자 계정은 로그인이 한 명만 가능하고 중복 로그인하면 이전 사용자는 강제 로그아웃
  • 일반 사용자는 설정에 맞게 중복 로그인이 가능 로그인 사용자가 꽉 차면 로그인 불가

그래서 org.springframework.security.core.session.SessionRegistry를 이용하여 구현을 했어요.

 

protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests().antMatchers("/ex/**").permitAll().anyRequest().authenticated();
	http.authorizeRequests().anyRequest().authenticated().and().formLogin().successHandler(
	        defaultLoginSuccessHandler).failureHandler(defaultLoginFailureHandler).loginPage(loginPage).failureUrl(
	                loginPage + "?error").permitAll().usernameParameter("id").passwordParameter("pwd");
	http.logout().logoutUrl("/logout").logoutSuccessUrl(loginPage).addLogoutHandler(defaultLogoutHandler)
	        .invalidateHttpSession(true).permitAll();
	// X-Frame-Options: DENY 설정하지 않음(다운로드컴포넌트를 위해)
	http.headers().frameOptions().disable();
	http.addFilterBefore(duplicatLoginFilter(), UsernamePasswordAuthenticationFilter.class);
	http.sessionManagement().maximumSessions(500).maxSessionsPreventsLogin(true).sessionRegistry(sessionRegistry)
	        .expiredUrl("/");
	http.csrf().disable();
}

protected DuplicateLoginFilter duplicatLoginFilter() throws Exception {
	
    return new DuplicateLoginFilter(sessionRegistry, loginSecurityService, loginPage, siteMapper);
    
}

@Bean
public PasswordEncoder passwordEncoder() {
	PasswordEncoder encoder = new CustomPasswordEncoder();
    return encoder;
    
}

 

세션은 총 500개로 잡았어요. 패스워드는 SHA256를 사용했어요.

 

public class DuplicateLoginFilter extends GenericFilterBean {

	private SessionRegistry sessionRegistry;
	private UserDetailsService userDetailsService;
	private String loginProcessUrl;
	private SiteMapper siteMapper;
	public DuplicateLoginFilter(final SessionRegistry sessionRegistry, final UserDetailsService userDetailsService,
	    final String loginProcessUrl, final SiteMapper siteMapper) {
		this.sessionRegistry = sessionRegistry;
		this.userDetailsService = userDetailsService;
		this.loginProcessUrl = loginProcessUrl;
		this.siteMapper = siteMapper;
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
	    throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) res;
		// post 방식에 로그인 요청이 아닌 경우 작업종료
		if (!new AntPathRequestMatcher(loginProcessUrl, "POST").matches(request)) {
			chain.doFilter(req, res);
			return;
		}
		log.info("login check filter has been requested.");
		boolean error = false;
		log.debug("로그인 세션수 -> {}", String.valueOf(sessionRegistry.getAllPrincipals().size()));
		try {
			String username = request.getParameter("id");
			String password = request.getParameter("pwd");
			// 패스워드 암호화
			byte pbCipher[] = new byte[32];
			SHA256Utils.SHA256_Encrpyt(password.getBytes("UTF-8"), password.length(), pbCipher);
			StringBuffer encPassword = new StringBuffer();
			for (int i = 0; i < 32; i++) {
				String hex = Integer.toHexString(0xff & pbCipher[i]);
				if (hex.length() == 1) {
					encPassword.append('0');
				}
				encPassword.append(hex);
			}
			UserDetails details = userDetailsService.loadUserByUsername(username);
			LoginUser principal = (LoginUser) details;
			// 사용자 정보 일치여부
			if (details.getPassword().equals(encPassword.toString())) {
				// 동일한 로그인 세션 체크
				log.debug(principal.toString());
				//public 공용, private 개인
				String idType = principal.getIdType();
				//공용일경우 로그인 제한 count
				int connCnt = principal.getConnCnt();
				log.debug("connCnt==" + connCnt);
				List<SessionInformation> sessionInfo = sessionRegistry.getAllSessions(principal, false);
			
				if ("private".equals(idType)) {
					//개인용 일경우 기존 정보가 있을경우 만료 후 로그인
					Iterator<SessionInformation> session = sessionInfo.iterator();
					while (session.hasNext()) {
						SessionInformation sessionInformation = session.next();
						LoginUser user = (LoginUser) sessionInformation.getPrincipal();
						if (user.getUsername().equals(username)) {
							sessionInformation.expireNow();
							break;
						}
					}
				} else {
					Iterator<SessionInformation> session = sessionInfo.iterator();
					int loginCnt = 1;
					while (session.hasNext()) {
						SessionInformation sessionInformation = session.next();
						LoginUser user = (LoginUser) sessionInformation.getPrincipal();
						if (user.getUsername().equals(username)) {
							if (connCnt <= loginCnt) {
								error = true;
								break;
							}
							loginCnt++;
						}
					}
				}
			} else {
				//사용자 정보 불일치
				MessageAlertUtils.alertRedirectMsg(response, "아이디 또는 비밀번호를 다시 확인하세요.", "/auth/login?error");
				return;
			}
		} catch (UsernameNotFoundException e) {
			MessageAlertUtils.alertRedirectMsg(response, "아이디 또는 비밀번호를 다시 확인하세요.", "/auth/login?error");
			//error = false;
		}
		log.debug("error==" + error);
		if (!error) {
			chain.doFilter(req, res);
			return;
		}
		MessageAlertUtils.alertRedirectMsg(response, "접속 가능한 인원수가 초과 되었습니다.", "/auth/login?error");
		return;
	}
}
728x90

위는 중복체크 filter 전체 소스예요

실제 중복 처리하는 부분은 아래 소스예요

Iterator<SessionInformation> session = sessionInfo.iterator();
while (session.hasNext()) {
	SessionInformation sessionInformation = session.next();
	LoginUser user = (LoginUser) sessionInformation.getPrincipal();
		
	//현재 로그인 된 사용자가 있으면 기존사용자 세션만료
	if (user.getUsername().equals(username)) {
		sessionInformation.expireNow();
		break;
	}
}

//해당계정 설정된 유저수가 넘으면 로그인 차단
Iterator<SessionInformation> session = sessionInfo.iterator();
int loginCnt = 1;
while (session.hasNext()) {
	SessionInformation sessionInformation = session.next();
	LoginUser user = (LoginUser) sessionInformation.getPrincipal();
	if (user.getUsername().equals(username)) {
		if (connCnt <= loginCnt) {
			error = true;
			break;
		}
		loginCnt++;
	}
}

각 요구사항에 맞게 처리한 로직이에요

 

직접 적용한 소스 기반으로 작성해봤어요

반응형

'개발' 카테고리의 다른 글

이클립스에서 한글이 깨질경우  (3) 2020.12.20
톰켓 Symbolic link(Windows)  (0) 2020.10.27
티스토리 소스코드 넣기  (0) 2020.08.13
반응형

카카오 API를 통해서 카카오 로그인을 남겨보려고 해요

 

https://developers.kakao.com/먼저 로그인을 하시고 내 애플리케이션 가서 만드시면 화면처럼 키가 발급이 되었을 거예요

 

 

 

 

저는 카카오 Rest Api를 사용해서 로그인을 할 거예요Rest방식은 Spring RestTemplate를 이용해서 가져올 거예요

 

 

 

 

카카오 인증절차예요.

카카오개발자(https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api) 사이트에서 가져왔어요

 

먼저 https://kauth.kakao.com/oauth/authorize?client_id={apiKey}&redirect_uri={returnUrl}&response_type=code

 

restApi키와 등록한 returnUrl을 넘기면

 

정상적으로 호출이 되면 동의 화면이 나올 거예요  황목설정은 "동의 항목"에서 설정이 가능해요

 

이제 "동의하고 계속하기"클릭 시 설정한 returnUrl로 redirect가 되면서 code이 넘어와요.

 

private static final String kakaoReturnUrl = "returnUrl";	
	private static final String kakaoLoginUrl = "https://kauth.kakao.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code";	

	private static final String kakaoKey = "apiKey";	
	private static final String kakaoToken = "https://kauth.kakao.com/oauth/token";
	private static final String kakaoProfile = "https://kapi.kakao.com/v2/user/me";
    
	private OverlapLogin loginManager = OverlapLogin.getInstance();
	
	@RequestMapping(value ="/openId/kakao", method=RequestMethod.GET)
	public String kakaoLogin(HttpServletRequest request, Model model, HttpSession session ) {
	
		return "redirect:" + String.format(kakaoLoginUrl, kakaoKey, (getServerName(request, kakaoReturnUrl)));
	
	}
	
	@RequestMapping(value ="/openId/kakaoLogin")
	public String kakaoLoginCallback(EnnacoreMap enna, Model model, HttpSession session,HttpServletRequest request, HttpServletResponse response ) throws Exception {

      //로그인 후 받는 code값
      String code = request.getParameter("code");

      MultiValueMap<String, Object> mmap = new LinkedMultiValueMap<String, Object>();

      mmap.add("grant_type", "authorization_code"); //필수 고정값
      mmap.add("client_id", kakaoKey); //카카오 rest_key
      mmap.add("redirect_url", getServerName(request, kakaoReturnUrl)); //응답받은 리턴URL
      mmap.add("code", code); //카카오 로그인 후

      HttpHeaders headers = new HttpHeaders();

      headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=utf-8"); //헤더지정
      HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String,Object>>(mmap, headers);

      RestTemplate restTemplate = new RestTemplate();
      FormHttpMessageConverter converter = new FormHttpMessageConverter();
      converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_FORM_URLENCODED));
      restTemplate.getMessageConverters().add(converter);

      //code를 이용해 로그인 사용자 token값 가벼오기
      ResponseEntity<AccessTokenRequestResponse> tokenResponse = restTemplate.postForEntity(kakaoToken, httpEntity, AccessTokenRequestResponse.class);
      headers.add("Authorization", "Bearer " + tokenResponse.getBody().getAccess_token());
      mmap.clear();
      httpEntity = new HttpEntity<MultiValueMap<String,Object>>(mmap, headers);

      //해당 토큰값으로 사용자 정보 가져오기
      ResponseEntity<UserProfileViewResponse> profileResponse = restTemplate.postForEntity(kakaoProfile, httpEntity, UserProfileViewResponse.class);

      // logger.info("loginRecd::::"+profileResponse.getBody().getKakao_account().getAge_range());
      // logger.info("loginRecd::::"+profileResponse.getBody().getKakao_account().getBirthday());
      // logger.info("loginRecd::::"+profileResponse.getBody().getKakao_account().getEmail());
      // logger.info("loginRecd::::"+profileResponse.getBody().getProperties().getNickname());

	}

    public String getServerName(HttpServletRequest req, String returnUrl) {

      StringBuffer serverName = new StringBuffer("");
      serverName.append("http://");
      serverName.append(req.getServerName());
      serverName.append(returnUrl);
      return serverName.toString();
    }

VO class들은 파일로 올렸습니다


AccessTokenRequest.java
0.00MB
AccessTokenRequestResponse.java
0.00MB
UserProfileViewKakaoAccountResponse.java
0.00MB
UserProfileViewPropertiesResponse.java
0.00MB
UserProfileViewResponse.java
0.00MB

반응형
반응형

ssh로 접속을할려면 먼저 ssh활성화를 시켜야합니다 제어판 -> 터미널가시면 ssh가 비활성화 되어있을거에요 체크하고 

port입력 후 적용하시면 ssh접속이 가능해요

 

root접속을 하기 위해서는 admin계정으로 들어가야하는데 처음에는 비활성이 되어있어요 편집에 들어가서 활성화 및 패스워드 지정하고 적용하시면되요

 

 https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

 

Download PuTTY: latest release (0.74)

This page contains download links for the latest released version of PuTTY. Currently this is 0.74, released on 2020-06-27. When new releases come out, this page will update to contain the latest, so this is a good page to bookmark or link to. Alternativel

www.chiark.greenend.org.uk

접속하여 OS맞는 프로그램을 다운받습니다

728x90

해당 nas아이피를 입력 후

 

admin / 패스워드 입력 후 sudo -i하면 root 접속이 되신거 확인될거에요

 

반응형

'시놀로지' 카테고리의 다른 글

시놀로지 Moments 사진업로드  (0) 2020.08.21
시놀로지 Video Station(DS VIDEO)  (0) 2020.08.16
시놀로지 방화벽 설정  (0) 2020.08.12
시놀로지 NAS 설정  (0) 2020.08.11
시놀로지NAS(DS220+)구입기  (0) 2020.08.11
반응형

구입 후 설치를 다 하고 이제 설정을 하러왔어요

 

http://find.quickconnect.to/ 접속을 하시면 LAN에 연결된 NAS를 찾아서 이미지 처럼 보여줄거에요

연결을 클릭을 하면

 

동의화면이 나올거에요

 

동의 후

 

기존 계정이 있으면 기존계정으로 전 없어서 신규 계정을 만들었어요

728x90

Quick설정을 하면 외부에서 접속할 수 있는 링크가 생성이되요 바탕화면 끌기 클릭하면 바탕화면에 바로가기 아이콘을 만들어줘요

 

 

이제 설정이 끝났어요 화면이 CentOs랑 비슷하게 생겼네요 UI로 하는거라 설정들이 어렵지는 않을거 같아요.

 

이제 이것저것 프로그램을 설치하고 놀아야겠어요 좀 더 다루어보고 다시 돌아올께요

반응형

'시놀로지' 카테고리의 다른 글

시놀로지 Moments 사진업로드  (0) 2020.08.21
시놀로지 Video Station(DS VIDEO)  (0) 2020.08.16
시놀로지 방화벽 설정  (0) 2020.08.12
시놀로지 ssh root 접속  (0) 2020.08.11
시놀로지NAS(DS220+)구입기  (0) 2020.08.11
반응형

처음으로 NAS를 구입하게 되었습니다. DS220+ (2베이) 집 근처 컴퓨존 가산점이있어서 방문수령으로 구입을 했어요.

 

NAS,하드,멀티탭

방문수령 후 사진 한장 찍었어요

 

 

집 도착 후 한장 찍었어요

 

개봉 후 한컷 찍었어요

 

 

 

전 WD 4테라 레드를 샀어요

 

개봉은 다 하였구 다음 설정으로 다시 돌아올께요

반응형

'시놀로지' 카테고리의 다른 글

시놀로지 Moments 사진업로드  (0) 2020.08.21
시놀로지 Video Station(DS VIDEO)  (0) 2020.08.16
시놀로지 방화벽 설정  (0) 2020.08.12
시놀로지 ssh root 접속  (0) 2020.08.11
시놀로지 NAS 설정  (0) 2020.08.11

+ Recent posts