App 로그인 자바 백그라운드 처리 및 사용자 권한 검증

최근에 앱 프로젝트를 하나 했는데 백그라운드에서 나 혼자 개발했다. 개발 임무 순서에 로그인, 등록과 권한 검증 등 기본 기능을 1단계에 두고 개발하지 않았다. 지금은 일부 업무 관련 기능이 완성되었지만 사용자 입구가 아직 없다는 것은 당초 수요 분석을 할 때 너무 급해서 가장 기본적인 사용자 입구를 뒤에 놓았다는 것을 설명할 수 있다.
현재 기존 코드를 바탕으로 사용자 로그인과 권한 검증 기능을 추가해야 한다.
로그인과 권한 검증에 있어 이전에 iOS를 개발한 경험을 참조하여 앱측은 사용자 이름과 비밀번호를 토큰으로 바꾸어 줍니다. 매번 토큰을 통해 로그인 권한을 요청하면 작업이 필요합니다.
지금 반대로 나는 다음과 같은 몇 가지 문제를 고려해야 한다.
1. 기존 기능의 코드에서 이러한 기능의 실현을 어떻게 비교적 쉽게 만족시킬 수 있는지에 따라 기존 코드의 변동이 크지 않고 앞으로 새로운 기능의 실현 권한 검증이 번거롭지 않다.
2. 사용자 이름과 비밀번호에 따라 토큰을 생성하고 권한이 필요한 기능에서 클라이언트가 토큰을 제공하는 정확성을 어떻게 구분하는가
먼저 첫 번째 문제에 직면하면 경험에 따라 일반적인 해결 방안은 필터, 차단기이다. 만약에 수요 배정에 로그인과 권한 검증을 앞에 두면 후기 기능의 URL이 일정한 규칙을 가지게 하면 필터나 차단기의 사용은 정말 여러 번 시도해 보면 불쾌하다.그러나 내가 지금 직면하고 있는 것은 전기에 어떠한 설계와 규범도 없는 URL이기 때문에 필터나 차단기를 사용하는 것은 내가 직면하고 싶지 않다.
상기 일반적인 해결 방안을 제외하고spring AOP는 바로 이런 문제를 해결하는 유리한 도구가 되었다. 상접면 프로그래밍을 이용하여 모든 권한 검증이 필요한 method에 대해 선행 알림을 했지만 url, 클래스 이름이나 방법이 규칙적이지 않기 때문에 나는 사용자 정의 주석(annotation)을 생각하고 사용자 정의 주석을 추가한 모든 method에 대해 권한 검증을 했다.
1.spring aop을 사용할 생각이 났으니, 우선 첫 번째 단계는spring 프로필에서 aop을 여는 것이다
//op 열기

위 설정은 프로젝트에spring - aop 관련jar 패키지를 붓고 프로필 헤더에 aop의 URL을 도입합니다
2. 그 다음에 사용자 정의 annotation을 정의합니다

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface UserAccess {

 

}

3. 우리는 아직 권한 검증 기능을 서둘러 할 수 없다. 왜냐하면 현재 우리의 토큰은 아직 방안을 생성하지 않았기 때문이다.
Token 생성에 있어서 단일 로그인을 고려하기 때문에 Token은 계속 고정될 수 없습니다. 그렇지 않으면 언제든지 Token을 가지고 있으면 적어도 두 사람이 같은 계정을 사용할 수 있습니다. 이것은 현재 우리의 업무상 허용되지 않는 것입니다.최종적으로 나는'username+password+ 로그인 시간'MD5 암호화를 token으로 선택했습니다(유일하고 가변적인 상황에서 uid와 같은 여러 가지 방법이 있습니다). 사용자 이름과 비밀번호를 검증하는 데 성공한 상황에서 token을 생성하고 token을'username:token'과'token: 사용자'키 값으로 저장하고 (데이터베이스에 저장할 수도 있습니다) 마지막으로 token을 클라이언트에게 되돌려줍니다.
다음 코드는 간단한 예제 하나만 사용합니다.

@Service

public class LoginService {

/**

*  “ :token” 

*/

public static Map<String,String> tokenMap=new HashMap<String,String>();

/**

*  “token:User” 

*/

public static Map<String,User> loginUserMap=new HashMap<String,User>();

 

public String login(String name,String password){

System.out.println(name+"-----"+password);

/**

*  

* 1. 

*  1.1. token 

*  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(" token");

}

token=MD5Util.MD5(name+password+new Date().getTime());

loginUserMap.put(token, user);

tokenMap.put(name, token);

System.out.println(" "+tokenMap.size()+" ");

for(User u:loginUserMap.values()){

System.out.println(u.getName()+":"+u.getPassword());

}

return token;

} 

}
4. 이 동시에 우리 클라이언트는 로그인한 후에 token을 얻었다. 모든 권한이 필요한 요청에 token을 휴대하면 응답을 성공적으로 얻을 수 있다(건의: 앱 인코딩을 편리하게 하기 위해 token은 요청 헤더에 휴대할 수 있고 기존 코드는 크게 변경할 필요가 없고 앞으로 token에 관심을 가질 필요가 없다).나는 아무렇게나 방법을 찾아서 실험을 했다.

@Controller

@RequestMapping("/login")

public class LoginController {

@Autowired

private LoginService loginService;

 

@UserAccess

@RequestMapping(value="/loginin",method=RequestMethod.GET)

public @ResponseBody String login(HttpServletRequest request){

String name=request.getParameter("name");

String password=request.getParameter("password");

String token=loginService.login(name, password);

return token;

}

}

굵은 부분은 사용자 정의 annotation입니다. 로그인 기능의 요청 매개 변수는 token이 있을 수 없기 때문에 몇 번을 검증해도 통과할 수 없습니다. 예를 들어 보기만 합니다.@권한 검증이 필요한 기능에 UserAccess 추가
5. 현재 사용자 정의 annotation은 좋은 착안점이다

@Component

@Aspect

public class PermissionAspect {

 

 // annotation 

@Before("@annotation(com.example.chap01.annotation.UserAccess)")

public void checkPermission(JoinPoint joinPoint) throws Exception{

System.out.println(" ");

// 

Object[] args = joinPoint.getArgs();

HttpServletRequest request=(HttpServletRequest)args[0];

String token=request.getParameter("token");

System.out.println("  token:"+token);

User user=LoginService.loginUserMap.get(token);

if(user==null){

System.out.println(" !");

throw new Exception(" ");

}

}

}
이로써 로그인과 권한 검증 기능이 모두 완성되었다.
그리고 개인github의 원본 코드를 첨부합니다https://github.com/zw201913/applogin.git
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기