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(liushaomingdev@163.com)
* @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,  谢谢

加群讨论源码
加群

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值