起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7828|回复: 15

[分享] 用户登录的baas实现

  [复制链接]

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
发表于 2016-7-12 22:06:56 | 显示全部楼层 |阅读模式
本帖最后由 负暄 于 2016-7-12 22:23 编辑

各位坛友,关于用户登录,几乎每个应用都会用到,重要性不言而喻。官方也提供了相关的例程,但我认为这个基于baasdata的例子实现得太简单,后台除了检查用户表记录,如果还想做点什么其它处理,不好扩充,因此我在baas端编写了一个myLogin服务,主要实现了一下两个动作:
1、接收前端传来的参数,在检查用户合法性之后,改写用户表中的最后登录时间。这一点实现了update的能力,只是个实例。大家可以进行修改,做一些自己想做的扩充动作;
2、在向前端返回登录结果时,除了返回用户信息,还返回了一个登录状态编码。这一点同样是个实例,大家也可以对返回结果做出自己的扩充。
在本实现中,参考了大神长春Masion的的帖子,
http://bbs.wex5.com/forum.php?mo ... ht=prepareStatement
受益匪浅,在此表示感谢。

下面就是具体的实现代码,首先是baas服务代码:

public static JSONObject myLogin(JSONObject params, ActionContext context) throws SQLException, NamingException  {               
                String DATASOURCE = "your datasource name";        //这里的your datasource name,改成自己的datasource        
                Connection conn = context.getConnection(DATASOURCE);
                                       
                // 获取参数               
                Object columns = params.get("columns");
                Integer limit = params.getInteger("limit");
                Integer offset = params.getInteger("offset");
                String fPhoneNumber  = params.getString("fPhoneNumber");//手机号
                String fPassword  = params.getString("fPassword");//密码,这参数大家也可以修改,只要前后端对应就行。
               
                List<Object> sqlParams = new ArrayList<Object>();
                sqlParams.add(fPhoneNumber);
                sqlParams.add(fPassword);               
               
                JSONObject ret = new JSONObject();
                Table table = null;        
                String querysql = "select * from userTableName where fPhoneNumber = ? and fPassword = ? ";        //这里的userTableName 改成自己的表名                 
                try {
                        table = DataUtils.queryData(conn, querysql, sqlParams, columns, offset, limit);               
                        JSONObject tableJson = Transform.tableToJson(table);                        
                        JSONArray rows = (JSONArray) tableJson.get("rows");                        
                        JSONObject rowJson = (JSONObject) rows.get(0);        //一般符合条件的记录只应该有一条,所以只取第一条                        
                        JSONObject fIDJson = (JSONObject) rowJson.get("fID");                //取什么字段可以自己修改
                        String fID = fIDJson.getString("value");
                                 
                        String transSql = " update userTableName  set fLastTime = now() ";//这里的userTableName 改成自己的表名         
                        transSql += " where fID = '";
                        transSql += fID ;
                        transSql += "'";        //这段sql大家可以修改成自己的版本,以实现登录后想做的动作
                        
                        java.sql.PreparedStatement pstmt = conn.prepareStatement(transSql);
                        if (pstmt.executeUpdate() == 1){
                            ret.put("loginStatus", "0"); //登录成功
                            ret.put("tableData", Transform.tableToJson(table)); //返回复合结果,不在只是简单的表记录,大家也可以进行扩充
                            //System.out.println("ret==="+ret);
                            return ret;
                        }else{
                            ret.put("loginStatus", "-1"); // 登录失败
                            ret.put("errorTxt", "更新登录状态失败!");         
                            return ret;
                        }                        
                }catch(Exception e){
                        ret.put("loginStatus", "-100"); // 登录失败
                        ret.put("errorTxt", e.toString());         
                    return ret;   
                } finally {
                        conn.close();
                }               
        }


评分

参与人数 1威望 +20 收起 理由
Masion + 20 很给力!

查看全部评分

64

主题

471

帖子

1127

积分

金牌会员

Rank: 6Rank: 6

积分
1127
发表于 2016-7-18 10:53:11 | 显示全部楼层
1、密码应该区分大小写,但你这样写就不区分大小写了
2、没有在后台session中保存用户身份信息,后续操作无法验证当前用户身份,你总不能每次操作都附带用户名密码吧,而前台传递来的用户信息时不可靠的,会点js的人,浏览器F12做点手脚或者直接模拟http请求就可以黑你的网站。
3、登录和查询是两码事,不应该返回Table数据,因为很多地方可能会单独登录,例如某个要授权的操作,用户越级访问了,后台检查到未登录就在前台跳转到登录界面,但那个时候只是要做登录,不需要返回用户信息显示,前台只要得到登录成功的结果即可,最多保存用户的ID。
4、密码必须加密,但这里明显是明文的密码。

点评

一看就知道神人~~~  发表于 2016-9-3 06:24
问题提得很专业,一看就是做过大型系统的  发表于 2016-8-31 09:40
回复 支持 2 反对 0

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
 楼主| 发表于 2016-7-12 22:08:43 | 显示全部楼层
本帖最后由 负暄 于 2016-7-12 22:11 编辑

然后就是在前端的login页面上,放一个data,取名为userData,设定好想要取到前端的列,将autoload设为false,并编辑其CustomRefresh事件。

//刷新用户信息
        Model.prototype.userDataCustomRefresh = function(event){
                var data = event.source;
                var currCity = SummerTools.getCurrentCity();
                var params = {                        
                        "columns" : Baas.getDataColumns(data),
                        "limit" : event.limit,
                        "offset" : event.offset,
                        "fPhoneNumber" :  this._phoneInput ,//全局变量,存放手机号
                        "fPassword" : this._passwordInput//全局变量,存放密码
                };               
                var success = function(resultData) {
                        if(resultData.loginStatus!=0){
                                justep.Util.hint("用户名或密码有误!", {
                                        "type" : "danger"
                                });                                                
                                return;
                        }else{                                //登录成功,加载到userData
                                var append = event.options && event.options.append;
                                data.loadData(resultData.tableData, append);                                
                        }                                       
                };               
                Baas.sendRequest({
                        "url" : "/xxxx/xxxx",//改为自己的url
                        "action" : "myLogin",
                        "async" : false,
                        "params" : params,
                        "success" : success
                });        
        };


回复 支持 反对

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
 楼主| 发表于 2016-7-12 22:18:02 | 显示全部楼层
最后是登录按钮的处理
//登录
        Model.prototype.loginBtn = function(event) {       
                this._phoneInput = this.comp("nameInput").val();    //全局变量赋值,取自存放手机号的Input
                this._passwordInput = this.comp("passwordInput").value;        //全局变量赋值,取自存放密码的password       
               
                var userData = this.comp("userData");       
                userData.refreshData();                                       
               
                if (userData.count()> 0) {                       
                        //保存登录信息
                        //登录成功后的处理,大家可以自行添加,可以用userData中的记录做自己的处理...               
                        //比如,userData.val("fID")可以取用户id,userData.val("fName")可以取用户名,userData.val("fImage")可以取用户头像等等 ......

                } else {               
                        justep.Util.hint("用户名或密码有误!", {
                                "type" : "danger"
                        });                                               
                        //登录失败的处理...大家可以自行添加
                }

        };

回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2016-7-13 08:12:36 | 显示全部楼层
顶楼主
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2016-7-13 08:13:33 | 显示全部楼层
话说在3.5版本中,我发现了页面模板中自带了登录界面(有两个)很是方便
建议参考一下
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
 楼主| 发表于 2016-7-13 09:04:28 | 显示全部楼层
Masion 发表于 2016-7-13 08:13
话说在3.5版本中,我发现了页面模板中自带了登录界面(有两个)很是方便
建议参考一下 ...

多谢,我看看。
回复 支持 反对

使用道具 举报

718

主题

2841

帖子

5657

积分

论坛元老

Rank: 8Rank: 8

积分
5657
QQ
发表于 2016-7-15 11:24:26 | 显示全部楼层
支持
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复

使用道具 举报

64

主题

471

帖子

1127

积分

金牌会员

Rank: 6Rank: 6

积分
1127
发表于 2016-7-16 17:49:16 | 显示全部楼层
能分享是好的,只是这质量不忍心看,问题太多不建议用。
回复 支持 反对

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
 楼主| 发表于 2016-7-18 08:54:37 | 显示全部楼层
qldsrx 发表于 2016-7-16 17:49
能分享是好的,只是这质量不忍心看,问题太多不建议用。

多谢批评指正,这个例子我本人正在使用中。有什么错误还请指教!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-24 05:05 , Processed in 0.070302 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表