App登陆java后台处理和用户权限验证

最近做一个app项目,后台我独自一人开发,开发任务顺序安排上没有把登陆,注册和权限验证这些基本功能放在第一阶段开发,现在是部分业务相关功能已经完成,但是用户入口竟然还没有,只能说明当初需求分析的时候还是太过于着急了,把最基本的用户入口给放到后面了。

现在就需要在现有代码的基础上添加用户登录和权限验证功能。

关于登录和权限验证方面,参照以前做iOS的开发经验,App端提供用户名和密码换取token,每次通过换取的token请求需要登陆权限的操作。

现在反过来,我就需要考虑下面几个问题:

1.在现有功能的代码上如何比较轻松地满足这些功能的实现,使得现有代码改动不大,并且今后新功能实现权限验证不麻烦

2.如何根据用户名和密码生成token,并且在需要权限的功能上如何区分客户端提供token的正确性

首先面对第一个问题,根据经验,常规解决方案就是过滤器,拦截器,若是在需求安排上登陆和权限验证这些放在前面的话,只要让后期功能的url有一定规律,过滤器或拦截器的使用简直屡试不爽。但是我现在面对的是前期没有任何设计和规范的url,所以使用过滤器或者拦截器是我不愿意面对的。

除了以上常规解决方案,spring AOP正好成了解决这类问题的利器,利用面相切面编程对所有需要权限验证的method做一个前置通知,但是由于url,类名或者方法没有规律,于是我想到了自定义注解(annotation),对所有加上自定义注解的method做权限验证。

1.既然已经想到使用spring aop了,那首先第一步就是在spring配置文件中开启aop

//开启aop

<aop:aspectj-autoproxy />

以上配置基于项目中倒入spring-aop相关jar包,并且在配置文件头部引入aop的url

2.其次我们先定义一个自定义annotation

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

@Retention(RetentionPolicy.RUNTIME)

public @interface UserAccess {

}

3.我们还不能急于做权限验证的功能,因为现在我们的token还没有生成方案。

在token生成上考虑到单点登录,所以token不能一直固定,否则在任何时候,只要拥有token就可以同时至少两个人使用同一个帐户,这是目前我们业务上不允许的。最终我选择了”username+password+登录时间“做MD5加密作为token(在保证唯一和可变的情况下,有很多方法,比如uuid)。在验证用户名和密码成功的情况下生成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即可成功获取响应(建议:为方便app编码,token可携带在请求头中,现有代码就无需大改动,并且今后都不需要关心token的问题)。我随便找了个method做实验:

@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

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)

    JavaWeb实现同一帐号同一时间只能一个地点登陆(类似QQ登录的功能)的实现思路如下所示: 一.该功能有什么作用 大家想想吧.反正总会有这样的需求的.这年头什么需求不会有..呵呵.有时候也不一定是需求,很有可能为了安全也会这么做.例如考试系统,在线聊天系统,很有必要做成这样的吧. 二.实现过程 a.问题分析 在系统中,我们一般都是把登录信息绑定到session中,看来从这入手是可能找到解决办法.说白了,也就是当用户登录时,判断一下这个用户有没有登录,如果登录了,就把以前的那个session清除

  • Java的Struts框架中登陆功能的实现和表单处理器的使用

    实现Struts登录 1.jar包拷贝 首先是建立java web项目,之后打开我们我们下载好strtus框架,Struts-1.2.9-bin文件夹和struts-1.2.9.src源文件文件夹.在bin文件夹中的lib文件中拷贝struts的jar包,拷贝到我们自己项目struts_login –>lib文件夹下. 2.web.xml文件配置 找到Struts-1.2.9-bin中Struts-1.2.9-bin-->webapps下的struts实例struts-blank中的strut

  • java模拟cookie登陆操作

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢? 方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时时将cookie发送过去用以表明身份,这样就能够访问带有权限的URL了. 下面首先介绍使用java模拟登陆. // 连接地址(通过阅读html源代码获得,即为登陆表单提交的URL) String surl = "http://login.goodjobs.cn/index.php/action/UserLo

  • SpringMVC实现账号只能在一处登陆

    一.问题引导 在Web开发中,实现一个账号只能在一处登陆有两种形式:1.当某个账号在某处登陆后,如果再在其他处登陆,将前一个账号挤掉:2.当某个账号登陆后,此账号在其他设备登陆提示已经登陆,无法登陆. 正常的应用逻辑第一种应用较为广泛,因此此篇文章讨论一下第一种逻辑在spring mvc开发中一种较为简单的实现方式. 然而在没有长连接如WebSocket或者异步请求轮询的情况下,我们之前登陆的账号只能在下一次请求(同步或异步)才能获取被挤掉的状态(如页面跳转). 二.实现步骤 1.建立一个静态M

  • App登陆java后台处理和用户权限验证

    最近做一个app项目,后台我独自一人开发,开发任务顺序安排上没有把登陆,注册和权限验证这些基本功能放在第一阶段开发,现在是部分业务相关功能已经完成,但是用户入口竟然还没有,只能说明当初需求分析的时候还是太过于着急了,把最基本的用户入口给放到后面了. 现在就需要在现有代码的基础上添加用户登录和权限验证功能. 关于登录和权限验证方面,参照以前做iOS的开发经验,App端提供用户名和密码换取token,每次通过换取的token请求需要登陆权限的操作. 现在反过来,我就需要考虑下面几个问题: 1.在现有

  • Java之Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就算这样,但你肯定也会有后台管理及登录功能. 每个项目中都会有这些几乎一样的业务逻辑,我们能不能把他们做成通用的系统呢? AOP 实现用户权限验证 AOP 在实际项目中运用的场景主要有权限管理(Authority Management).事务管理(Transaction Management).安全管

  • MySQL用户权限验证与管理方法详解

    本文实例讲述了MySQL用户权限验证与管理方法.分享给大家供大家参考,具体如下: 一.Mysql权限分两阶段验证 1. 服务器检查是否允许连接:用户名.密码,主机地址. 2. 检查每一个请求是否有权限实施. 二.Mysql权限列表 权限 权限级别 权限说明 create 数据库.表或索引 创建数据库.表或索引权限 drop 数据库或表 删除数据库或表权限 grant option 数据库.表或保存的程序 赋予权限选项 references 数据库或表 外键权限 alter 表 更改表,比如添加字

  • vuex根据不同的用户权限展示不同的路由列表功能

    需求描述 最近接到一个新的需求,要求将系统的用户进行分类,用户登陆后根据不同的用户权限展示不同的功能列表. 这个功能在后台管理中很常见,大致的思路是 后台返回用户类型,前端根据用户类型生成该类用户可以访问的功能列表. 后台返回功能列表,前端进行循环渲染. 一个在前端生成功能列表,一个在后端返回,两个本质上类似,最终都是需要得到一个该用户的功能功能列表.但是两者都有一个不可忽视的东西,就是如果用户直接在地址栏输入会怎么样. 技术选型 由于公司项目不算小,为了后期维护方便,我还是选择了使用 vuex

  • 支付宝APP支付(IOS手机端+java后台)版

    0.介绍预览 针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付.如图: 1.资料准备 1.1 账号注册 打开https://openhome.alipay.com,注册支付宝开放平台开发者账号 1.2 开发者认证 登录,进入开发者中心,进行开发者资质认证,并创建移动应用. 1.3 签约应用 创建应用后上传相关资料,上线应用并通过审核.审核通过后点击应用,进行签约,此步骤不能省略,否则或报ISV权限不足. 1.4 应用配置 打开应用信息,配置一下内容,接口签名可下载支付宝签名验签工具进

  • java web实现用户权限管理

    最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc + spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能. 一套最基本的权限管理包括用户.角色.资源. 实现效果: 数据库设计,设计如下: 用户:user 角色:role 用户-角色:user_role 资源:resource(包括上级菜单.子菜单.按钮等资源) 角色-资源:role_resource 标准的权限管理系统设计为以上5

  • java后台实现支付宝支付接口和支付宝订单查询接口(前端为APP)

    最近项目APP需要接入微信.支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司机,所以很自然把简单的支付宝接口开发任务交给了我,看来开发组的组长还是很好人的嘛.....,废话就不多说了,我们开始吧! 实现支付宝接口详细过程 1.去支付宝官网申请公司企业账号并开通一个应用,在应用里签约APP支付功能 具体的申请截图步骤,在这里我就不详细说了,因为这不是文章的重点,可参考支付宝官

  • 微信APP支付(IOS手机端+java后台)版

    0.介绍预览 针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付.如图: 1.资料准备 1.1 账号注册 打开https://open.weixin.qq.com,注册微信开放平台开发者账号 1.2 开发者认证 登录,进入账号中心,进行开发者资质认证. 1.3 注册应用 认证完成后,进入管理中心,新建移动应用.填写应用资料,其中android版应用签名可通过扫码安装温馨提供的应用获得,详细参考微信文档.创建完成后点击查看,申请开通微信支付.一切准备就绪! 2.Java后台开发 添加依赖

  • Java 使用Filter实现用户自动登陆

    前言 安全,是如今互联网行业特别注重的一个话题.在大家学习了JavaWeb之后呢,发现一个网站应该有安全限制,例如:如果用户未登录,则不允许相关CRUD操作,而如果我们在后台的每一个Servlet都进行判断,将降低系统效率,也会出现大量代码冗余.因此,就有了Filter过滤器. 1.什么是Filter Filter,过滤器,是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改.判断等,把不符合规则的请求在中途拦截或修改.也可以对响应进行过滤,拦截或修

  • java后台接收app上传的图片的示例代码

    整理文档,搜刮出一个java后台接受app上传的图片的示例代码,稍微整理精简一下做下分享 package com.sujinabo.file; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; import javax.servlet.S

随机推荐