Java登錄認證-基於userId+token-框架fpassport(含github源碼)

     前段時間,自己開發了一個網絡API調用的框架"fpassport",可以用於大多數的網絡接口調用(HTTP調用)裏的權限認證--用戶登錄。 驗證條件是userId+token合法,才能調用響應的接口成功。

否則,則返回錯誤代碼(比如token錯誤,userId不存在等) 。不管調用成功與否,返回給客戶端的都是json數據。 

      fpassport框架在大多數App的用戶登錄模塊,一些常見web項目裏的用戶登錄模塊,API調用的權限認證。  只要是使用了SpringBoot或者SpringMVC了的,都可以使用這個框架。

fpassport代碼見本人的github:    https://github.com/liushaoming/fpassport  (有所有java代碼和SQL建庫腳本)

 

技術架構: 
1.Spring + Spring MVC + myBatis 
2.maven 
3.fpassport登錄模塊 
4.mysql 
5.redis  + mysql來存放用戶的userId和token (即使redis掛了,此模塊仍然可訪問數據庫,來確保攔截認證正常工作)

 

 

 

核心原理:

創建自己的LoginInterceptor類去擴展spring mvc提供的HandlerInterceptorAdapter類, 來攔截Spring MVC裏需要用戶登錄認證的controller

 

public class LoginInterceptor extends HandlerInterceptorAdapter

 

fpassport框架裏使用了註解@AuthController來限定需要攔截的Controller.

LoginInterceptor裏判斷Controller是否被@AuthController限定,如果是,則根據request來取得參數userId和token,並用兩個參數去Redis和DB中去檢查其合法性。

如果合法,則返回true,並放行;否則返回false,並且返回錯誤代碼。

String token = request.getHeader("token");
String userId = request.getHeader("userId");

 

注意:這裏的controller要想能被攔截,在使用的時候需要滿足兩條件:

1. 在自己的spring mvc項目的appContext.xml做如下配置,配置被掃描的controller的一個範圍

 

<bean id="loginIntercepter" class="org.flylib.passport.intercepter.LoginInterceptor"></bean>
<mvc:interceptors>  
       	<mvc:interceptor>  
          		<mvc:mapping path="/account/**" />  
          		<ref bean="loginIntercepter"/> 
       	</mvc:interceptor>
     </mvc:interceptors> 

 

2. 在被攔截的Controller,需要添加註解@AuthController, 例如

 

/** 
* @author Frank Liu([email protected])
* @version 創建時間:2017年8月21日 下午10:28:35 
* 類說明 
*/
@RequestMapping("account")
@Controller
@AuthController
public class AccountController {
	@RequestMapping("getInfo")
	@ResponseBody
	public String getInfo(String userId, String token) {
		
		return "getInfo success.";
	}
}


下面附上fpassport最核心代碼,在LoginInterceptor.java

 

 

@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
	private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
	@Autowired
	LoginIntercepterService loginIntercepterService;
	
	@Autowired
	private TokenService tokenService;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String token = request.getParameter("token");
		String userId = request.getParameter("userId");

		if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
        	logger.info("進入攔截器...........");
    		Object controller = handlerMethod.getBean();
    		printParameters(request, controller);
    		// 訪問需要登錄的接口那些
    		// 被@AuthController註解的Controller
    		boolean isPresent = controller.getClass().isAnnotationPresent(AuthController.class);
    		if (isPresent && !StringUtils.isEmpty(userId)) {
        		logger.info("訪問需要登錄的接口(Authed)...........");
    			if (StringUtils.isEmpty(token)) {
    				flushError(response, AuthResponseCode.TOKEN_IS_NULL, AuthResponseCode.TOKEN_IS_NULL_DESC);
    				return false;
    			}
    			Passport passport = loginIntercepterService.getPassport(new Long(userId));
    			String storedToken = passport.getToken();
    			if (StringUtils.isEmpty(storedToken)) {
					flushError(response, AuthResponseCode.TOKEN_EXPIRED, AuthResponseCode.TOKEN_EXPIRED_DESC);
					return false;
    			} else if (!storedToken.equals(token)) {
    					flushError(response, AuthResponseCode.TOKEN_INVALID, AuthResponseCode.TOKEN_INVALID_DESC);
        				return false;
    			}
    			
            } // 被@AuthController註解的 結束
            
        }     //HandlerMethod 結束
		
		boolean flag = isPermission(request, response);
		logger.info("isPermission:" + flag);
		return flag;
	}
}

 

框架使用步驟

 

Step1: git clone https://github.com/liushaoming/fpassport
Step2: cd fpassport 
mvn install 
這樣就把fpassport-1.0.0-SNAPSHOT.jar安裝到了自己PC上的本地倉庫裏了。
Step3: 在自己的SpringMVC/SpringBoot項目裏引用fpassport-1.0.0-SNAPSHOT.jar依賴

 

在自己項目pom.xml添加如下代碼

 

 <dependency>
		<groupId>org.flylib</groupId>
		<artifactId>fpassport</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</dependency>

 

Step4: 修改自己的applicationContext.xml以及其它Spring相關的配置文件(具體參考fpassport-site項目),按照fpassport裏面的SQL建表腳本建立表。

 

修改property/jdbc.properties和property/redis.properties, 改成自己的庫的username,password
 

fpassport代碼見本人的github:    https://github.com/liushaoming/fpassport (有所有java代碼和SQL建庫腳本)

 

歡迎start點贊。

自己的博客網站http://github.com/liushaoming

 

路過的記得點星星star,  謝謝

加羣討論源碼
加羣

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章