Java登入認證-基於userId+token-框架fpassport(含github原始碼)
前段時間,自己開發了一個網路API呼叫的框架"flylib-passport",可以用於大多數的網路介面呼叫(HTTP呼叫)裡的許可權認證--使用者登入。 驗證條件是userId+token合法,才能呼叫響應的介面成功。
否則,則返回錯誤程式碼(比如token錯誤,userId不存在等) 。不管呼叫成功與否,返回給客戶端的都是json資料。
flylib-passport框架在大多數App的使用者登入模組,一些常見web專案裡的使用者登入模組,API呼叫的許可權認證。 只要是使用了SpringBoot或者SpringMVC了的,都可以使用這個框架。
flylib-passport程式碼見本人的github: https://github.com/flylib/fpassport (有所有java程式碼和SQL建庫指令碼)
技術架構:
1.Spring + Spring MVC + myBatis
2.maven
3.flylib-passport登入模組
4.mysql
5.redis + mysql來存放使用者的userId和token (即使redis掛了,此模組仍然可訪問資料庫,來確保攔截認證正常工作)
核心原理:
建立自己的LoginInterceptor類去擴充套件spring mvc提供的HandlerInterceptorAdapter類, 來攔截Spring MVC裡需要使用者登入認證的controller
public class LoginInterceptor extends HandlerInterceptorAdapter
flylib-passport框架裡使用了註解@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.";
}
}
下面附上flylib-passport最核心程式碼,在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/flylib/fpassport
Step2: cd flylib-passport
mvn install
這樣就把flylib-passport-1.0.0-SNAPSHOT.jar安裝到了自己PC上的本地倉庫裡了。
Step3: 在自己的SpringMVC/SpringBoot專案裡引用flylib-passport-1.0.0-SNAPSHOT.jar依賴
在自己專案pom.xml新增如下程式碼
<dependency>
<groupId>org.flylib</groupId>
<artifactId>flylib-passport</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
Step4: 修改自己的applicationContext.xml以及其它Spring相關的配置檔案(具體參考flylib-site專案),按照flylib-passport裡面的SQL建表指令碼建立表。
修改property/jdbc.properties和property/redis.properties, 改成自己的庫的username,password
flylib-passport程式碼見本人的github: https://github.com/flylib/fpassport (有所有java程式碼和SQL建庫指令碼)
歡迎start點贊。
自己的部落格網站http://github.com/flylib