최근에 저는 앱 프로젝트를 진행하고있었습니다. 나는 그것을 백그라운드에서 혼자 개발했습니다. 로그인, 등록 및 권한 검증의 기본 기능은 개발 작업 순서대로 개발의 첫 단계에 포함되지 않았습니다. 이제 일부 비즈니스 관련 기능이 완료되었지만 사용자 포털은 아직 구현되지 않았습니다. 이것은 요구 사항을 처음 분석하고 가장 기본적인 사용자 포털을 뒤에 두었을 때 너무 불안하다는 것을 보여줍니다.
이제 기존 코드를 기반으로 사용자 로그인 및 권한 확인 기능을 추가해야합니다.
이전 iOS 개발 경험을 참조하는 로그인 및 권한 확인과 관련하여 앱 측은 토큰을 교환하기위한 사용자 이름과 비밀번호를 제공하며 교환 토큰을 통해 각 요청에 대한 로그인 권한이 필요합니다.
반면에 다음과 같은 문제를 고려해야합니다.
1. 기존 함수 코드에서 이러한 기능의 구현을 쉽게 충족하는 방법으로 기존 코드가 크게 변경되지 않았으며 향후 권한 검증을 구현할 번거 로움이 없습니다.
2. 사용자 이름과 비밀번호를 기반으로 토큰을 생성하는 방법 및 권한이 필요한 기능에서 토큰을 제공하는 클라이언트의 정확성을 구별하는 방법
우선, 경험에 따르면 첫 번째 문제에 직면하여 기존의 솔루션은 필터와 인터셉터입니다. 로그인 및 권한 검증이 요구 사항 배열에 배치되는 경우, 이후 함수의 URL에 특정 패턴이 주어지면 필터 또는 인터셉터의 사용이 성공할 것입니다. 그러나 지금은 초기 단계에서 설계 나 사양이없는 URL에 직면하고 있으므로 필터 나 인터셉터를 사용하고 싶지 않습니다.
위의 기존 솔루션 외에도 Spring AOP는 이러한 유형의 문제를 해결하는 무기가되었습니다. Face-Tangent 프로그래밍을 사용하여 권한 검증이 필요한 모든 방법에 대한 사전 사례를 제공합니다. 그러나 URL, 클래스 이름 또는 메소드는 규칙적이지 않기 때문에 사용자 정의 주석을 생각하고 사용자 정의 주석을 추가하는 모든 메소드에 대한 권한을 확인합니다.
1. Spring AOP를 이미 생각 했으므로 첫 번째 단계는 Spring 구성 파일에서 AOP를 활성화하는 것입니다.
// AOP를 엽니 다
<aop : SAGON-AUTOPROXY />
위의 구성은 프로젝트에 Spring-Aop 관련 JAR 패키지를 쏟아 부어 구성 파일 헤더에 AOP의 URL을 소개하는 것을 기반으로합니다.
2. 다음으로, 먼저 사용자 정의 주석을 정의해 봅시다
@TARGET ({ElementType.Method, ElementType.Type}) @retention (retentionPolicy.runtime) public @interface userAccess {}3. 토큰이 아직 해결책을 생성하지 않았기 때문에 권한 검증 기능을 서두르지 않을 수 없습니다.
토큰 생성을 위해서는 단일 사인온이 고려되므로 토큰을 항상 수정할 수 없습니다. 그렇지 않으면, 언제라도 토큰이있는 한, 동시에 동시에 동일한 계정을 사용할 수 있으며 현재 비즈니스에서는 허용되지 않습니다. 결국, 나는 "사용자 이름 + 암호 + 로그인 시간"을 선택하여 MD5 암호화를 토큰으로 수행했습니다 (고유성과 돌연변이를 보장 할 때 UUID와 같은 많은 방법이 있습니다). 사용자 이름과 비밀번호가 성공적으로 확인되면 토큰을 생성하고 "사용자 이름 : 토큰"및 "토큰 : 사용자"의 키 값 쌍 (데이터베이스에 저장할 수 있음)의 키 값 쌍의 형태로 토큰을 저장하고 마침내 토큰을 클라이언트로 되돌립니다.
다음 코드는 간단한 예입니다.
@ServicePublic 클래스 LoginService {/*** Store "사용자 이름 : Token"Key-Value Pair*/public static map <string, String> TokenMap = new Hashmap <String, String> ();/*** 저장 "Token : user"key-value 쌍*/public static map <string, user> loginusermap = new Hashmap <string, User> (); 공개 문자열 로그인 (문자열 이름, 문자열 비밀번호) {System.out.println (이름+"-----"+암호);/*** 로그인이 성공했는지 확인* 1. 로그인이 성공적으로* 1.1. 해당 토큰 및 업데이트 * 1.2를 성공적으로 생성하십시오. 실패한 경우 예외를 던지십시오*/String token = tokenmap.get (name); user user = null; if (token == null) {user = new user (); user.setname (name); user.setpassword (password); system.out.println ( "새 사용자. 로그인 ");} else {user = loginusermap.get (token); loginusermap.remove (token); system.out.println ("Update User Login Token ");} token = md5util.md5 (name+password+new date (). loginusermap.put (token, user); token); system.out.println ( "현재"+tokenmap.size ()+"user"); for (user u : loginusermap.values ()) {system.out.println (u.getName ()+":"+u.getPassword ());}}}}}}}}}4. 동시에, 우리의 고객은 로그인 한 후 토큰을 얻었습니다. 허가가 필요한 모든 요청에서 토큰을 소지하는 한 응답을 성공적으로 얻을 수 있습니다 (제안 : 앱 인코딩을 용이하게하기 위해서는 토큰을 요청 헤더에서 수행 할 필요가 없으며, 기존 코드는 미래에 토큰 문제를 관리 할 필요가 없습니다). 방금 실험을 수행하는 방법을 찾았습니다.
@controller@requestmapping ( "/login") 공개 클래스 logincontroller {@autowiredPrivate loginservice loginservice; @userAccess @requestMapping (value = "/loginin", method = requestmethod.get) public @responsebody 문자열 로그인 (httpservletrequest request) {string name = request.getParameter ( "name"); String password = request.getParameter ( "password") ( "string token = loginservice.login (password);대담한 부분은 주석을 사용자 정의하는 것입니다. 로그인 함수의 요청 매개 변수에 대한 토큰을 갖는 것은 불가능하므로 몇 번이나 확인하더라도 전달할 수 없습니다. 그냥 모범을 보이십시오. @userAccess 추가 권한 확인이 필요한 기능에만 추가됩니다.
5. 사용자 정의 주석은 이제 좋은 진입 점입니다
@component@public class rimismentaSpect {// 사용자 정의 주석을 입력 지점으로 설정합니다 @Before ( "@annotation (com.example.chap01.annotation.useraccess)") public void checkpermission (joinpoint jointpoint) 예외 {system.out.println ( "pre-notification"); joinpoint.getargs (); httpservletrequest request = (httpservletrequest) args [0]; String token = request.getParameter ( "Token"); System.out.println ( "pre-notification token :"+token); 사용자 user = loginservice.loginusermap.get (token); if (user == null) {system.out.println ( "확인이 전달되지 않습니다!"); 새로운 예외 ( "허가 없음");}}}}이 시점에서 로그인 및 권한 검증 기능이 모두 완료됩니다.
또한 Personal Github의 소스 코드가 첨부되어 있습니다 : https://github.com/zw201913/applogin.git
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.