精华内容
下载资源
问答
  • 如何更改linux文件的拥有者及用户组(chown和chgrp)

    万次阅读 多人点赞 2012-07-28 19:18:20
    本文整理自: ... http://ydlmlh.iteye.com/blog/1435157... 一、基本知识 在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者及用户组,当然root用户可以修改任何文...

    本文整理自: 

    http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/

    http://ydlmlh.iteye.com/blog/1435157

    一、基本知识

      在Linux中,创建一个文件时,该文件的拥有者都是创建该文件的用户。该文件用户可以修改该文件的拥有者及用户组,当然root用户可以修改任何文件的拥有者及用户组。在Linux中,对于文件的权限(rwx),分为三部分,一部分是该文件的拥有者所拥有的权限,一部分是该文件所在用户组的用户所拥有的权限,另一部分是其他用户所拥有的权限。对于文件的权限请参考《Linux的chmod命令

       文件(含文件夹,下同)的权限,在shell中可以通过chmod命令来完成,关于此请参考Linux的chmod命令在 shell 中,可以使用chown命令来改变文件所有者及用户组,chgrp命令来改变文件所在用户组。在 Linux的C程序中,可以使用chown函数来改变文件所有者,所在用户组。

      另外,在shell中,要修改文件当前的用户必须具有管理员root的权限。可以通过su命令切换到root用户,也可以通过sudo获得root的权限。

    二、使用chown命令更改文件拥有者

    在 shell 中,可以使用chown命令来改变文件所有者。chown命令是change owner(改变拥有者)的缩写。需要要注意的是,用户必须是已经存在系统中的,也就是只能改变为在 /etc/passwd这个文件中有记录的用户名称才可以

    chown命令的用途很多,还可以顺便直接修改用户组的名称。此外,如果要连目录下的所有子目录或文件同时更改文件拥有者的话,直接加上 -R的参数即可。

    基本语法:

    chown [-R] 账号名称 文件目录

    chown [-R账号名称:用户组名称 文件目录

    参数

    -R : 进行递归( recursive )的持续更改,即连同子目录下的所有文件、目录

    都更新成为这个用户组。常常用在更改某一目录的情况。

    示例1

    [root@localhost home]# touch testfile //由 root 用户创建文件 

    [root@localhost home]# ls testfile –l 

    -rw--w--w- 1 root root 0 Jun 7 19:35 testfile //文件的拥有者及拥有者级均为 root 

    [root@localhost home]# chown yangzongde testfile //修改文件拥有者为 yangzongde 

    [root@localhost home]# ls testfile -l 

    -rw--w--w- 1 yangzongde root 0 Jun 7 19:35 testfile //查看文件拥有者为 yangzongde,但组仍为 root 

    示例2

    chown bin install.log

    ls -l

    -rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

    chown root:root install.log

    ls -l

    -rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

    三、使用chgrp命令更改文件所属用户组

    在shell中,可以使用chgrp命令来改变文件所属用户组,该命令就是change group(改变用户组)的缩写。需要注意的是要改变成为的用户组名称,必须在 /etc/group里存在,否则就会显示错误。

    基本语法:

    chgrp [-R用户组名称 dirname/filename ...

    参数:

    -R : 进行递归( recursive )的持续更改,即连同子目录下的所有文件、目录

    都更新成为这个用户组。常常用在更改某一目录的情况。

    示例3

    [root@localhost home]# ls testfile -l 

    -rw--w--w- 1 yangzongde root 0 Jun 7 19:35 testfile //查看文件拥有者为 yangzongde,但组为 root 

    [root@localhost home]# chgrp yangzongde testfile //修改拥有者组为 yangzongde 

    [root@localhost home]# ls testfile -l 

    -rw--w--w- 1 yangzongde yangzongde 0 Jun 7 19:35 testfile 

    [root@localhost home]# chown root:root testfile // 使用 chown 一次性修改拥有者及组 

    [root@localhost home]# ls testfile -l 

    -rw--w--w- 1 root root 0 Jun 7 19:35 testfile 

    示例4

    [root@linux ~]# chgrp users install.log

    [root@linux ~]# ls -l

    -rw-r--r--  1 root users 68495 Jun 25 08:53 install.log

    示例5

    更改为一个 /etc/group不存在的用户组

    [root@linux ~]# chgrp testing install.log

    chgrp: invalid group name `testing' <== 出现错误信息~找不到这个用户组名~

    四、chown 函数的使用

    在Linux 的C 应用编程中,可以使用 chown 函数来修改文件的拥有者及拥有者组。此函数声明如下: 

    /usr/include/unistd.h文件中

    
     

     

    /* Change the owner and group of FILE. */ 

    extern int chown (__const char *__file, __uid_t __owner, __gid_t __group)__THROW __nonnull ((1)) __wur; 

     

    此函数的第一个参数为欲修改用户的文件,第二个参数为修改后的文件拥有者,第三个参数为修改后该文件拥有者所在的组。

     

    对于已打开的文件,使用 fchown 函数来修改。其第一个参数为已打开文件的文件描述符,其他同 chown 函数。该函数声明如下: 

    
     

     

    /* Change the owner and group of the file that FD is open on. */ 

    extern int fchown (int __fd, __uid_t __owner, __gid_t __group) __THROW __wur; 

     

    对于连接文件,则可以使用 lchown 函数。其参数同于 chown 函数。 

    
     

     

    /* Change owner and group of FILE, if it is a symbolic link the ownership of the symbolic 

    link is changed. */ 

    extern int lchown (__const char *__file, __uid_t __owner, __gid_t __group) __THROW __nonnull ((1)) __wur; 

     

    以上这 3 个函数如果执行成功,将返回 0,否则返回-1。

    更多干货,请关注我的微信公众号:红柚甜

     

    展开全文
  • Linux 修改用户密码

    万次阅读 多人点赞 2019-06-05 16:45:32
    Linux修改密码用 passwd 命令,用root用户运行passwd ,passwd user_name可以设置或修改任何用户的密码,普通用户运行passwd只能修改它自己的密码。 [root@localhost ~]# passwd ##修改root用户密码 Changing ...

    Linux修改密码用 passwd 命令,用root用户运行passwdpasswd user_name可以设置或修改任何用户的密码,普通用户运行passwd只能修改它自己的密码。

    [root@localhost ~]#  passwd  ##修改root用户密码
    Changing password for user root..
    New password: ##输入新密码
    Retype new password:  ##再次确认新密码
    passwd: all authentication tokens updated successfully.
    
    [root@localhost ~]# passwd hadoop  ##修改hadoop用户密码
    Changing password for user hadoop.
    New password:  ##输入新密码
    Retype new password:  ##再次确认新密码
    passwd: all authentication tokens updated successfully.
    

    一、passwd 常用参数如下:

    • -k ##keep-tokens keep non-expired authentication tokens 注:保留即将过期的用户在期满后能仍能使用;
    • -d ##delete delete the password for the named account (root only) 注:删除用户密码,仅能以root权限操作;
    • -l ##lock lock the named account (root only) 注:锁住用户无权更改其密码,仅能通过root权限操作;
    • -u ##unlock unlock the named account (root only) 注:解除锁定;
    • -f ##force force operation 注:强制操作;仅root权限才能操作;
    • -x ##maximum=DAYS maximum password lifetime (root only) 注:两次密码修正的最大天数,后面接数字;仅能root权限操作;
    • -n ##minimum=DAYS minimum password lifetime (root only) 注:两次密码修改的最小天数,后面接数字,仅能root权限操作;
    • -w ##warning=DAYS 注:在距多少天提醒用户修改密码;仅能root权限操作;
    • -i ##inactive=DAYS 注:在密码过期后多少天,用户被禁掉,仅能以root操作;
    • -S ##status report password status on the named account (root only) 注:查询用户的密码状态,仅能root用户操作;

    1、例如让某个用户不能修改密码,可以用-l 参数来锁定:

    [root@localhost ~]# passwd -l hadoop   ## 注:锁定用户hadoop不能更改密码;
    Locking password for user hadoop.
    passwd: Success  ##注:锁定成功;
    [hadoop@localhost ~]# su - hadoop   ##注:su切换到hadoop用户;
    [hadoop@localhost ~]$ passwd  ##注:hadoop用户更改密码;
    Changing password for user hadoop.
    Changing password for hadoop
    (current) UNIX password:   ## 注:输入hadoop的当前密码;
    passwd: Authentication token manipulation error  ## 注:失败,不能更改密码;
    

    2、例如清除一个用户的密码 用参数-d,密码清除后登录就无需密码

    [root@localhost ~]# passwd -d hadoop  ##注:清除hadoop用户密码;
    Removing password for user hadoop.
    passwd: Success    ##注:清除成功;
    [root@localhost ~]# passwd -S hadoop  ##注:查询hadoop用户密码状态;
    Empty password.   ##注:空密码,没有密码
    

    二、密码时效命令:chage ,修改用户密码有效期限;chage 命令格式:chage [-l] [-m 最小天数] [-M 最大天数] [-W 警告] [-I 失效日] [-E 过期日] [-d 最后日] 用户

    • -m days: 密码可更改的最小天数。为零时代表任何时候都可以更改密码。
    • -M days: 指定口令有效的最多天数。当该选项指定的天数加上-d选项指定的天数小于当前的日期时,用户在使用该帐号前就必须改变口令。
    • -d days: 指定从1970年1月1日起,口令被改变的天数。
    • -I days: 指定口令过期后,帐号被锁前不活跃的天数。如果值为0,帐号在口令过期后就不会被锁。
    • -E date: 指定帐号被锁的日期。日期格式YYYY-MM-DD。若不用日期,也可以使用自1970年1月1日后经过的天数。
    • -W days: 指定口令过期前要警告用户的天数。
    • -l: 列出指定用户当前的口令时效信息,以确定帐号何时过期。

    例如设置用户hadoop两天内不能更改口令,并且口令最长的存活期为30天,并且口令过期前5天通知用户的命令:chage -m 2 -M 30 -W 5 hadoop
    查看用户hadoop当前的口令时效信息:chage -l hadoop
    备注:1.可以用chage user_name进入交互模式修改用户的口令时效;
    2.修改口令实质上就是修改口令文件/etc/shadow中与口令时效相关的字段值。

    三、passwd 修改密码报错 passwd:Authentication token manipulation error
    root用户或者普通用户修改密码失败 ;报的错误 密码:身份验证令牌操作错误;一般是密码文件的权限的问题,或者是该用户锁定不能修改密码,或者是根目录空间满了。
    1.首先查看磁盘空间是否满了df -hl,如果满了,查找出占用较大的无用文件清空或删除;常用到命令:

    • du -lh --max-depth=1 :查看当前目录下各文件大小
    • du -sh:查看当前目录总的大小
    • du -sh * | sort -n:统计当前目录下文件大小,并按文件大小排序
    • du -sk file_name:查看指定的file文件大小
      2.可以用lsattr命令查看存放用户和密码的文件属性lsattr /etc/passwdlsattr /etc/shadow,(i:不得任意更动文件或目录),如果有i选项,则会导致所有的用户都不能修改密码,因为没有权限允许;
      可以用chattr命令将i权限撤销 chattr -i /etc/passwdchattr -i /etc/shadow,然后再修改用户密码。
    展开全文
  • Linux基础之用户用户组管理

    万次阅读 2019-10-09 09:50:17
    linux操作系统与windows操作系统相比,更加适合于服务器领域,今天,我们就来介绍在Linux下,如何对用户用户组及其密码管理。 Linux系统属于多用户、多任务的分时操作系统,任何一个要使用系统资源的用户,都必须...

     

    linux操作系统与windows操作系统相比,更加适合于服务器领域,今天,我们就来介绍在Linux下,如何对用户、用户组及其密码管理。

    Linux系统属于多用户、多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份登入系统。

    用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问
    还可以帮助用户组织文件,并为用户提供安全性保护
    每个用户账号都拥有一个惟一的用户名(UID)和各自的密码
    用户在登录时输入正确的用户名和密码后,才能够登入系统
    用户账号的添加 useradd、删除 userdel 、修改 usermod 
    用户组的添加 groupadd 、删除 groupdel、修改 groupmod、 
    显示每个输入的用户名所在的全部组 groups 添加删除组里的成员 gpasswd
    查看、添加、删除组里的成员 groupmems
    用户密码的管理 passwd

    系统用户管理:

    在系统中添加一个新用户,然后为新用户分配用户号(UID)、用户组(GID)、主目录(HOME_DIR)和登录Shell等资源。

    useradd命令说明:

    参数说明:

    使用实例|:

    创建用户test,采用/etc/login.defs文件的默认参数:

    MAIL_DIR    /var/spool/mail           #用户默认邮箱目录                      
    PASS_MAX_DAYS   99999              #密码最长过期时间
    PASS_MIN_DAYS   0                      #密码最短过期时间
    PASS_MIN_LEN    5                       #密码最小长度
    PASS_WARN_AGE   7                   #密码过期提前提醒时间
    UID_MIN                  1000               #普通用户UID最小值
    UID_MAX                 60000             #普通用户UID最大值
    SYS_UID_MIN               201           #系统用户UID最小值
    SYS_UID_MAX               999          #系统用户UID最大值
    GID_MIN                  100                #普通组GID最小值
    GID_MAX                 60000            #普通组GID最大值
    SYS_GID_MIN               201          #系统组GID最小值
    SYS_GID_MAX               999         #系统组GID最大值
    CREATE_HOME    yes                  #默认创建用户家目录
    UMASK           077                        #默认用户家目录权限 drwx------ 2 test  test   62 10月  9 11:10 test
    USERGROUPS_ENAB yes           #默认创建同用户名称的用户组
    ENCRYPT_METHOD SHA512       #密码加密方式为SHA512

    新建一个用户:test1,该用户属于系统用户,UID为210,忽略/etc/login.defs文件的默认设定:创建一个密码不会过期的系统账户,即使系统账户没有密码。它属于1007用户组,同时又属于1006组,不创建同名test1组,登录Shell是 /usr/bin/nologin,家目录/tmp/test1。

    注意指定要加入的组必须事先存在!

    添加用户规则的两个文件:/etc/default/useradd 和 /etc/login.defs:

     

    修改用户帐号

    修改用户账号就是更改用户的相关属性,如用户号(UIG)、家目录(HOME_DIR)、用户组(GROUP)、登录Shell等。

    usermod命令说明:

    常用的选项:

    使用实例:

    修改test1用户的UID号为300,更换属主组为1004,添加附加组1005,移动家目录到/home/test1,修改登录SHELL为/uer/bin/bash.

     

    删除用户帐号

    userdel命令说明:

    常用的选项:

    使用实例:

    删除用户test1,邮箱以及删除用户的家目录。

     

    用户密码的管理

    用户管理的一项重要内容是用户密码的管理。用户账号刚创建时没有密码,但是被系统锁定,无法使用,必须为其指定密码后才可以使用,即使是指定空密码。

    passwd命令说明:

    可使用的选项:

    如果当前用户是普通用户,则修改该用户自己的密码,需要提供当前用户使用的密码,否则不能修改:

    如果是超级用户(root),可以修改任何用户的密码,不需要知道用户的原密码:

    推荐使用--stdin参数来设置密码

     

    用户组的管理

     

    查看、添加、删除组里的成员 groupmems
    用户组的添加 groupadd 、删除 groupdel、修改 groupmod
    显示每个输入的用户名所在的全部组 groups
    添加删除组里的成员 gpasswd

    查看组里的所有成员

    groupmems命令说明:

    使用实例:

    查看普通组bash里的成员

    将用户添加、删除操作

    groupadd命令说明:

    可以使用的选项有:

    使用实例:

    添加一个普通组onegrp,GID为系统默认顺延1008。

    在系统中添加了一个新组mygrp,为系统组,指定GID为220

    修改用户组的属性

    groupmod命令说明:

    常用的选项有:

    使用实例:

    更改组onegrp的名称为twogrp,GID更改为350

     

    添加、删除组里的成员

    gpasswd命令说明:

    常用选项有:

    使用实例:

    将普通用户test添加到系统组mygrp

    将普通用户test从系统组mygrp中删除

    删除用户组

    groupdel命令说明:

    使用实例:

    从系统中删除组twogrp
    
    展开全文
  • 最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺... 我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要...

        最近,对微信公众号有点兴趣,就自己研究了研究里面的一些内容,发现还挺有意思的,而且通过微信公众号可以调用一些比较有意思的接口,就比如百度开发服务平台 点击进入 里面的很有接口,就比较常见的翻译,语音识别,地理位置等等,都挺好的。好了,不多说,进入正题好了。

        我想,做微信公众号开发的,对于想获取关注了公众号的用户信息,或者说是当前与后台服务器进行交互的当前用户信息,这个功能是很重要的吧。因为,通过这个,可以直接获取到当前的用户信息,而不需要,每次都是进行自己输入信息,这个只会让用户感觉到很不适。。。所以,为了解决这个需求,那咱们来研究研究,如何获取微信的个人信息~!

    大家可以关注我的微信公众号:Java菜鸟进阶之路。便于日常阅读哦!   

     

    目录

     (一)思路

    (二)情况一:通过用户与服务器进行消息交互,来获取用户信息

    (三)情况二:通过点击按钮,来直接获取到用户信息

    Github仓库地址:

    彩蛋:


     (一)思路

    我们来研究一下,要想获取到个人信息,是如何一个流程呢?

    路线图:

    上面,画了一个简单的一个流程图,我想,看着这个应该觉得不难吧。是的,确实思路很简单,但是,,里面的坑也不少。接下来,我对两种情况都进行讲解。

    (二)情况一:通过用户与服务器进行消息交互,来获取用户信息

    思路:针对这种情况的话,比较简单,因为,我们在做用户与服务器进行消息交互的时候,我们可以知道,用户发送的内容是以XML的形式进行发送的,然后服务器,首先接受到XML,然后再把XML转为Map对象,再从Map对象中获取对应的内容即可。那么,发送的XML的字段是个怎么样呢?

    字段信息:

    ToUserName:发送给谁的ID
    FromUserName:发消息方的ID(其实也就是用户的OpenId)
    CreateTime:消息发送时间,时间戳
    MsgType:消息类似,有文本,图片,音频,视频,事件推送等
    Content:发送的内容

    通过这个,我想大家,再结合上面给的流程图,是不是发现了什么呢?是的,这个OpenId,我们已经获取了呀,那是不是可以直接获取到用户信息了呢?。。。。emmmmmm,这样说吧。差不多是可以的,那具体是怎么做呢?紧接着往下看,仔细看我其中的注释

    步骤:

    1:解析发送过来的XML信息格式,将其转为Map格式

    /**
         * XML格式转为map格式
         * @param request
         * @return
         */
        public static Map<String , String> xmlToMap(HttpServletRequest request){
            Map<String ,String> map = new HashMap<String , String>();
            try {
                InputStream inputStream =null;
                inputStream = request.getInputStream();
                SAXReader reader = new SAXReader();
                Document doc = reader.read(inputStream);
                Element rootElement = doc.getRootElement();
                List<Element> elements = rootElement.elements();
                for (Element el:elements) {
                    map.put(el.getName() , el.getText());
                }
                inputStream.close();
                return map ;
            } catch (Exception e) {
                e.printStackTrace();
                return null ;
            }
        }

    备注:记得导入相应的包哦。。比如dom4j还有xsreader。。

    2:获取用户的个人信息

    package com.hnu.scw.utils;
    
    import com.hnu.scw.model.AccessToken;
    import net.sf.json.JSONObject;
    
    /**
     * @author scw
     * @create 2018-01-18 16:42
     * @desc 用于获取微信用户的信息
     **/
    public class WeiXinUserInfoUtils {
        private static final String GET_USERINFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
        /**
         * 获取微信用户账号的相关信息
         * @param opendID  用户的openId,这个通过当用户进行了消息交互的时候,才有
         * @return
         */
        public static String getUserInfo(String opendID){
            AccessToken accessToken = WeiXinUtils.getAccessToken();
            //获取access_token
            String token = accessToken.getToken();
            String url = GET_USERINFO_URL.replace("ACCESS_TOKEN" , token);
            url = url.replace("OPENID" ,opendID);
            JSONObject jsonObject = WeiXinUtils.doGetStr(url);
            return jsonObject.toString();
        }
    }

    备注:传入的参数就是咱们之前说过的,FromUserName的值,这个应该不用多解释吧。因为,对于传入的XML,我们已经存入了Map中,那么直接从Map取出对应的字段信息就可以了,

    String fromUserName = map.get("FromUserName");

    3:通过上面,我们就得到了具体的用户信息的Json格式了,当然,我上面的方法将Json内容转为了String,我这里只是用于查看是否获取到信息了而已,所以,你们就根据各自的需求进行处理就可以了,该解析的就解析即可。。

    总结:

    上面的这种方法是不是很简单,这个没什么难的,而且这个根据微信公众号的开发手册也可以分析出来。

    缺点:我们发现了,这种方法,只有当用户进行了消息交互,才会有FromUserName(这时候可以等价看成是OpenId),那么我们在实际开发中,肯定遇到了一种情况,就是用户没有进行消息交互,直接点击一个菜单按钮,然后就把用户信息自动显示到了一个页面中,那这样是怎么做,方法是一样吗?不多说,继续看下面~~~~~~~~~

    (三)情况二:通过点击按钮,来直接获取到用户信息

    思路:首先,点击菜单按钮,要先到网页授权的接口去请求(主要是获取Code,这是必须要的一个参数),然后再重定向到我们自己菜单按钮实际想去的URL,然后再获取OpenId,再通过OpenId,获取用户信息。。哇塞,咦,思路挺简单的嘛。。那么,我们开始工作。。

    步骤:

    1:创建菜单

    对于这个自定义菜单的话,不是主要介绍的了,这个如果做过微信公众号开发的,应该都明白吧。所以,我这就贴一点关键代码:

    ViewButton viewButton = new ViewButton();
            viewButton.setName("view菜单");
            viewButton.setType("view");
            //viewButton.setUrl("http://myjava.ngrok.xiaomiqiu.cn/tomainpage");
            viewButton.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXX&redirect_uri=http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

    备注:大家,请注意,这个view菜单的URL,和我们平常的跳转的区别再哪里。。

     

    分析:

    知识点1:

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXX

    这个就是网页授权的接口地址,其中的appid就是我们自己微信公众号申请的时候,给我们的唯一值,这个大家去微信公众号查看即可。

     

    知识点2:

    redirect_uri=http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect");

    这个就是我们实际想要点击按钮,跳转到的页面,这个就和咱们平常的跳转是一样的,所以一定要记住,要先去授权页面,再重定向回去(主要是为了获取code参数)。

     

    2:配置微信公众号的网页授权域名

    备注:这个是在自己微信公众号的开发管理模块里面的,而且,我这里用的是测试号进行的(当然,如果有企业号这更加好呀。界面也是一样)

    注意点:对添加的回调页面域名:首先,不能加入http://这个,对于平常的链接,我想都有这个,这个是请求协议,但这里千万不能加入;另外,只需要写总的域名地址,不需要精确到最内层。打个比方:

    一般的:

    http://myjava.ngrok.xiaomiqiu.cn/tologin/userinfo

    这里就配置就只需要:(其实就是配置我们的服务器域名即可)

    myjava.ngrok.xiaomiqiu.cn

    3:编写,相应的处理内容(关键代码,请仔细看)

    备注:我用的是SSH(SpringMVC+Spring+Hibernate)框架来进行开发的,当然,用Servlet也可以,用SSM(SpringMVC+Spring+Mybatis)或者用SSH(Struts+Spring+Hibernate)都可以,这个根据自己的需求即可相应的改变呢!!(另外,这个几个框架,我其他的文章都有很详细的介绍了,所以自己看看相应配置即可)

    Controller层代码:

    package com.hnu.scw.controller;
    import com.hnu.scw.bean.WeiXinUser;
    import com.hnu.scw.service.WeiXinUserInfoService;
    import com.hnu.scw.utils.WeiXinUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @author scw
     * @create 2018-01-18 17:47
     * @desc 获取微信用户的所有信息,这个主要是为了不要用户自己填写个人信息
     **/
    @Controller
    public class WeiXinUserInfoController {
    
        @Autowired
        private WeiXinUserInfoService userService;
    
        /**
         * 进行网页授权,便于获取到用户的绑定的内容
         * @param request
         * @param session
         * @param map
         * @return
         */
        @RequestMapping("/tologin/userinfo")
        public String check(HttpServletRequest request , HttpSession session, Map<String, Object> map) {
            //首先判断一下session中,是否有保存着的当前用户的信息,有的话,就不需要进行重复请求信息
            WeiXinUser  weiXinUser = null ;
            if(session.getAttribute("currentUser") != null){
                weiXinUser = (WeiXinUser) session.getAttribute("currentUser");
            }else {
                /**
                 * 进行获取openId,必须的一个参数,这个是当进行了授权页面的时候,再重定向了我们自己的一个页面的时候,
                 * 会在request页面中,新增这个字段信息,要结合这个ProjectConst.Get_WEIXINPAGE_Code这个常量思考
                 */
                String code = request.getParameter("code");
                try {
                    //得到当前用户的信息(具体信息就看weixinUser这个javabean)
                    weiXinUser = getTheCode(session, code);
                    //将获取到的用户信息,放入到session中
                    session.setAttribute("currentUser", weiXinUser);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            map.put("weiXinUser", weiXinUser);
            return "hello";
        }
    
        /**
         * 获取用户的openId
         * @param session
         * @param code
         * @return 返回封装的微信用户的对象
         */
        private WeiXinUser getTheCode(HttpSession session, String code) {
            Map<String , String>  authInfo = new HashMap<>();
            String openId = "";
            if (code != null)
            {
                // 调用根据用户的code得到需要的授权信息
                authInfo= userService.getAuthInfo(code);
               //获取到openId
                openId = authInfo.get("Openid");
            }
            // 获取基础刷新的接口访问凭证(目前还没明白为什么用authInfo.get("AccessToken");这里面的access_token就不行)
            String accessToken = WeiXinUtils.getAccessToken().getToken();
            //获取到微信用户的信息
            WeiXinUser userinfo = userService.getUserInfo(accessToken ,openId);
    
            return userinfo;
        }
    }

    Service层接口:

    package com.hnu.scw.service;
    import com.hnu.scw.bean.WeiXinUser;
    import java.util.Map;
    /**
     * 用于进行微信用户个人信息的操作接口
     */
    public interface WeiXinUserInfoService {
         /**
          * 获取到微信个人用户的信息
          * @param accessToken
          * @param openId
          * @return
          */
         WeiXinUser getUserInfo(String accessToken, String openId);
    
         /**
          *用于获取网页授权后的信息字段,其中主要是获取openId
          * @param code  授权码
          * @return
          */
         Map<String , String > getAuthInfo(String code);
    
         /**
          * 进行网页授权的认证
          * @param code 授权码
          * @return
          */
         Map<String,String> oauth2GetOpenid(String code);
    }
    

    Service层实现:

     

    package com.hnu.scw.service.imp;
    import com.hnu.scw.bean.WeiXinUser;
    import com.hnu.scw.projectconst.ProjectConst;
    import com.hnu.scw.service.WeiXinUserInfoService;
    import com.hnu.scw.utils.WeiXinUtils;
    import net.sf.json.JSONObject;
    import org.springframework.stereotype.Service;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @author scw
     * @create 2018-01-18 17:51
     * @desc 用于获取微信用户的信息
     **/
    @Service
    public class WeiXinUserInfoImlp implements WeiXinUserInfoService {
        /**
         * 获取微信用户的信息
         * @param accessToken
         * @param openId
         * @return
         */
        @Override
        public WeiXinUser getUserInfo(String accessToken, String openId) {
            WeiXinUser weixinUserInfo = null;
            // 拼接获取用户信息接口的请求地址
            String requestUrl = ProjectConst.GET_WEIXIN_USER_URL.replace("ACCESS_TOKEN", accessToken).replace(
                    "OPENID", openId);
            // 获取用户信息(返回的是Json格式内容)
            JSONObject jsonObject = WeiXinUtils.doGetStr(requestUrl);
    
            if (null != jsonObject) {
                try {
                    //封装获取到的用户信息
                    weixinUserInfo = new WeiXinUser();
                    // 用户的标识
                    weixinUserInfo.setOpenId(jsonObject.getString("openid"));
                    // 昵称
                    weixinUserInfo.setNickname(jsonObject.getString("nickname"));
                    // 用户的性别(1是男性,2是女性,0是未知)
                    weixinUserInfo.setSex(jsonObject.getInt("sex"));
                    // 用户所在国家
                    weixinUserInfo.setCountry(jsonObject.getString("country"));
                    // 用户所在省份
                    weixinUserInfo.setProvince(jsonObject.getString("province"));
                    // 用户所在城市
                    weixinUserInfo.setCity(jsonObject.getString("city"));
                    // 用户头像
                    weixinUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
                } catch (Exception e) {
                    if (0 == weixinUserInfo.getSubscribe()) {
                        System.out.println("用户并没有关注本公众号");
                    } else {
                        int errorCode = jsonObject.getInt("errcode");
                        String errorMsg = jsonObject.getString("errmsg");
                        System.out.println("由于"+errorCode +"错误码;错误信息为:"+errorMsg+";导致获取用户信息失败");
                    }
                }
            }
            return weixinUserInfo;
        }
    
        /**
         * 进行用户授权,获取到需要的授权字段,比如openId
         * @param code 识别得到用户id必须的一个值
         * 得到网页授权凭证和用户id
         * @return
         */
        @Override
        public Map<String, String> oauth2GetOpenid(String code) {
            //自己的配置appid(公众号进行查阅)
            String appid = ProjectConst.PROJECT_APPID;
            //自己的配置APPSECRET;(公众号进行查阅)
            String appsecret = ProjectConst.PROJECT_APPSECRET;
            //拼接用户授权接口信息
            String requestUrl = ProjectConst.GET_WEBAUTH_URL.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
            //存储获取到的授权字段信息
            Map<String, String> result = new HashMap<String, String>();
            try {
                JSONObject OpenidJSONO = WeiXinUtils.doGetStr(requestUrl);
                //OpenidJSONO可以得到的内容:access_token expires_in  refresh_token openid scope
                String Openid = String.valueOf(OpenidJSONO.get("openid"));
                String AccessToken = String.valueOf(OpenidJSONO.get("access_token"));
                //用户保存的作用域
                String Scope = String.valueOf(OpenidJSONO.get("scope"));
                String refresh_token = String.valueOf(OpenidJSONO.get("refresh_token"));
                result.put("Openid", Openid);
                result.put("AccessToken", AccessToken);
                result.put("scope", Scope);
                result.put("refresh_token", refresh_token);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * 获取到微信用户的唯一的OpendID
         * @param code  这是要获取OpendId的必须的一个参数
         * @return
         */
        @Override
        public Map<String , String> getAuthInfo(String code) {
            //进行授权验证,获取到OpenID字段等信息
            Map<String, String> result = oauth2GetOpenid(code);
            // 从这里可以得到用户openid
            String openId = result.get("Openid");
    
            return result;
        }
    }

    4:GET请求接口的代码:

    package com.hnu.scw.utils;
    import com.hnu.scw.menu.BaseButton;
    import com.hnu.scw.menu.ClickButton;
    import com.hnu.scw.menu.CustomeMenu;
    import com.hnu.scw.menu.ViewButton;
    import com.hnu.scw.model.AccessToken;
    import net.sf.json.JSONObject;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    /**
     * @author scw
     * @create 2018-01-17 14:13
     * @desc 用户获取access_token,众号调用各接口时都需使用access_token
     **/
    public class WeiXinUtils {
        /**
         * Get请求,方便到一个url接口来获取结果
         * @param url
         * @return
         */
        public static JSONObject doGetStr(String url){
            DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            JSONObject jsonObject = null;
            try{
                HttpResponse response = defaultHttpClient.execute(httpGet);
                HttpEntity entity = response.getEntity();
                if(entity != null){
                    String result = EntityUtils.toString(entity, "UTF-8");
                    jsonObject = JSONObject.fromObject(result);
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return jsonObject;
        }

    5:获取Access_Token代码:(这个就是在4中的类中的方法)

    /**
         * 获取access_token
         * @return
         */
        public static AccessToken getAccessToken(){
            AccessToken accessToken = new AccessToken();
            String url = ACCESS_TOKEN_URL.replace("APPID" ,APPID).replace("APPSECRET",APPSECRET);
            JSONObject jsonObject = doGetStr(url);
            if(jsonObject !=null){
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpireIn(jsonObject.getInt("expires_in"));
            }
            return accessToken;
        }

    6:Access_Token的实体类

    package com.hnu.scw.model;
    /**
     * @author scw
     * @create 2018-01-17 14:35
     * @desc 封装AccessToken的实体
     **/
    public class AccessToken {
        private String token;
        private int expireIn;
    
        public String getToken() {
            return token;
        }
        public void setToken(String token) {
            this.token = token;
        }
        public int getExpireIn() {
            return expireIn;
        }
        public void setExpireIn(int expireIn) {
            this.expireIn = expireIn;
        }
    }

    7:用户信息的实体类

    package com.hnu.scw.bean;
    /**
     * @author scw
     * @create 2018-01-18 17:11
     * @desc 对于微信用户本身存在的信息的一个javabean,不需要在数据库中进行处理
     **/
    public class WeiXinUser {
        // 用户的标识
        private String openId;
        // 关注状态(1是关注,0是未关注),未关注时获取不到其余信息
        private int subscribe;
        // 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
        private String subscribeTime;
        // 昵称
        private String nickname;
        // 用户的性别(1是男性,2是女性,0是未知)
        private int sex;
        // 用户所在国家
        private String country;
        // 用户所在省份
        private String province;
        // 用户所在城市
        private String city;
        // 用户的语言,简体中文为zh_CN
        private String language;
        // 用户头像
        private String headImgUrl;
        public String getOpenId() {
            return openId;
        }
        public void setOpenId(String openId) {
            this.openId = openId;
        }
        public int getSubscribe() {
            return subscribe;
        }
        public void setSubscribe(int subscribe) {
            this.subscribe = subscribe;
        }
        public String getSubscribeTime() {
            return subscribeTime;
        }
        public void setSubscribeTime(String subscribeTime) {
            this.subscribeTime = subscribeTime;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
        public int getSex() {
            return sex;
        }
        public void setSex(int sex) {
            this.sex = sex;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        public String getProvince() {
            return province;
        }
        public void setProvince(String province) {
            this.province = province;
        }
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getLanguage() {
            return language;
        }
        public void setLanguage(String language) {
            this.language = language;
        }
        public String getHeadImgUrl() {
            return headImgUrl;
        }
        public void setHeadImgUrl(String headImgUrl) {
            this.headImgUrl = headImgUrl;
        }
    }

    8:一些静态常量的接口地址:

    package com.hnu.scw.projectconst;
    
    /**
     * @author scw
     * @create 2018-01-18 15:31
     * @desc 项目相关的静态量
     **/
    public class ProjectConst {
        /**
         * 用于获取当前与微信公众号交互的用户信息的接口(一般是用第一个接口地址)
         */
        public static final String GET_WEIXIN_USER_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
        public final static String GetPageUsersUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    
        /**
         * 用于进行网页授权验证的接口URL,通过这个才可以得到opendID等字段信息
         */
        public final static String GET_WEBAUTH_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    
        /**
         * 用于进行当点击按钮的时候,能够在网页授权之后获取到code,再跳转到自己设定的一个URL路径上的接口,这个主要是为了获取之后于
         * 获取openId的接口相结合
         * 注意:参数:toselfURL  表示的是当授权成功后,跳转到的自己设定的页面,所以这个要根据自己的需要进行修改
         */
        public final static String Get_WEIXINPAGE_Code = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=toselfURL&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
        /**
         * 获取access_token的URL
         */
        private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
    }

    9:大功告成。。。。哇塞,完美解决。。

    总结:

    这种方式,相对于上面的话,好处就在于,不需要进行消息交互就可以获取到用户的信息,这样其实更符合我们的业务需求,相对于更加好。但是,第一种情况也是有实用价值的,所以,我们要客观的进行评价和使用~~~~当然,这里面还有很多的可以优化的地方,就是,比如获取Access_Token,我们一般都是弄到本地,因为微信公众号一天请求的次数有限制(2000),所以这可以进行优化哦。。。。其他的根据需求来就可以啦!!!!!!!!

         好了,这个就介绍这个多了,都是经过本人亲自测试通过后的代码,所以,大家可以放心的使用,有问题的话,可以进行留言交流哦。。。

    Github仓库地址:

    https:https://github.com/qq496616246/WeChatCode.git

    git:git@github.com:qq496616246/WeChatCode.git

    彩蛋

    如果你想利用闲暇零散的学习技术,那么不妨关注我的公众号阅读你想要的文章哦!

    公众号搜索:Java菜鸟进阶之路

    展开全文
  • 用SSH工具XShell连接谷歌云 root用户或普通用户

    万次阅读 多人点赞 2018-03-17 16:34:35
    1.以root用户登入 2.普通用户,秘钥登入 3.启动shadowsocks失败 1.用root用户登入 1.1.进入谷歌云实例面板 1.2.切换到root角色 sudo -i 1.3.修改SSH配置文件/etc/ssh/sshd_config vi /etc/ssh/...
  • Windows10_如何修改用户文件夹下的中文用户文件夹名

    万次阅读 多人点赞 2018-09-12 11:20:20
    那么下面来说说到底如何修改win10用户文件夹中中文用户的文件夹名字…. 1. 首先进入管理员账户(Administrator) 一般很多人的管理员用户是禁用的,此时就找到“此电脑”右击,点击管理 点击管理后,出现如下的...
  • 用户权限相关命令 对 文件 / 目录 的权限包括: 以后就分文章写啦 文章目录用户权限相关命令1.1基本概念1.2组1.3 ls -l 扩展1.4.组管理 终端命令1.5.用户管理 终端命令 1.1基本概念 ·用户 是Linux系统工作中重要的...
  • 微信小程序授权 获取用户信息

    万次阅读 多人点赞 2018-05-30 18:25:37
    获取用户信息(用户信息、获取unionId、openId)请移步到这里 用户打开小程序时,直接弹框获取用户信息授权,可能会立马懵圈: 你是谁? 我在哪里? 我为什么要同意?…… 相当一部分用户下意识会拒绝...
  • linux下如何完全删除用户

    万次阅读 多人点赞 2018-11-02 16:42:03
    1、首先进入系统创建一个用户  [root@localhost /]# useradd haha #创建用户 haha是用户名  [root@localhost /]# passwd haha #为该用户设置密码  更改用户 haha 的密码 。  新的 密码:*****...
  • CentOS 进入单用户模式

    万次阅读 2021-03-30 13:51:17
    linux centos 单用户模式
  • 用户画像总结

    万次阅读 多人点赞 2018-03-28 14:45:51
    (文章内的图片来源于不同帖子,权当分享,侵删)一、 什么是用户画像 用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签,而标签是通过对用户...
  • Oracle创建用户并授权dba权限

    万次阅读 多人点赞 2018-07-31 13:35:21
    很多时候我们用拥有DBA权限的用户 从oracle数据库导出数据,那么再导入新的数据库时就还得需要DBA权限的用户,下面是如何创建一个新用户并授予DBA权限命令。 1.用有dba权限的用户登录:sys用户 2.创建一个新用户:...
  • 不要直接使用 root 用户管理应用数据 添加用户 以root用户登录数据库,运行以下命令: create user zhangsan identified by 'zhangsan'; 上面的命令创建了用户 zhangsan, 密码是 zhangsan. 在 mysql.user 表里可以...
  • 1、初始化仓库 mkdir /home/git # 在自己指定的文件夹下 git init --bare sample.git 2、修改权限 ...3、创建用户用户组 useradd gituser1 passwd gituser1 # 设置密码 useradd gituser2 passw...
  • 查询用户信息指 id 用户名 注意:当用户不存在时,返回无此用户。 切换用户 在操作Linux中,如果当前用户的权限不够,可以通过 su - 指令,切换到高权限用户,比如root, 基本语法: su – 切换用户名 或 ...
  • 修改树莓派用户密码

    万次阅读 2017-12-09 17:30:19
    树莓派在安装系统之后都会有原始默认的用户名和密码,接下来我们可以自行修改树莓派的用户密码。
  • Kali Linux 2020切换root用户

    万次阅读 多人点赞 2020-02-24 16:59:05
    2020版本较之前有个较大的不同的地方就是它不再是默认root用户登录,这算是它的一个革新,然而我们在终端操作命令的时候还是需要root用户,2020的安装过程中,系统提示我们创建一个用户,非root,这并不方便,切换...
  • Win10-更改c盘下的用户文件夹名

    万次阅读 多人点赞 2017-05-12 15:55:01
    下面说下怎么更改 c盘下的用户文件夹名。(肯定不是简单粗暴的重命名就完事了)首先 要进入管理员账户(Administrator)许多人找不到 管理员账户的原因是 windows 默认是禁用管理员账户 的,要解禁的方法很简单:...
  • Linux 普通用户和root用户任意切换

    万次阅读 多人点赞 2018-01-12 22:00:37
    1、[xnlay@bogon ~]$含义:xnlay代表当前用户,bogon指的是主机名,~表示当前用户,$表示普通用户;[root@bogon ~]#root代表是超级用户,在#下输入命令。 2、输入命令: su -,此时输入当前用户的密码(root用户...
  • Linux下创建用户用户

    万次阅读 多人点赞 2019-04-10 09:44:45
    1.linux下创建用户 日常运维我们使用useradd命令来创建用户,常用的命令如下: 不加任何参数,仅创建用户 示例:useradd myuser 此时用户的家目录是/home/myuser -d 目录 指定用户主目录,如果此目录不存在,...
  • MySQL创建用户与授权

    万次阅读 2018-07-06 11:00:16
    创建用户命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';说明:username:你将创建的用户名host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机...
  • 创建用户,自动在/home/目录下创建相应的文件夹 sudo adduser <用户名> 用户授权 chown -R <用户名>:<密码> /home/<用户名> chmod 760 /home/<用户名> 查看有sudo权限的用户...
  • Centos7 查看用户用户

    万次阅读 2019-05-31 15:49:47
    1、用户列表文件:/etc/passwd/ 2、用户组列表文件:/etc/group 3、查看系统中有哪些用户: $ cut -d : -f 1 /etc/passwd 4、查看可以登录系统的用户 $ cat /etc/passwd | grep -v /sbin/nologin | cut -d ...
  • MYSQL的创建用户,授权用户,删除用户,查看用户

    万次阅读 多人点赞 2017-02-15 15:51:26
    1.查看用户 2.创建用户 3.授权用户 4.删除用户 5.设置与更改用户密码 6.撤销用户权限 1.查看用户 查看用户并没有直接的SQL语句,而是进入 mysql数据库的user表(这个mysql库和user表都是一开始就有的),直接用 ...
  • 我们在开发小程序时,如果想获取用户信息,就需要获取用的授权,如果用户误点了拒绝授权,我们怎么样去正确的引导用户重新授权呢。今天就来给大家讲讲如果正确的引导用户授权。 老规矩,先看效果图 从上图可以看出...
  • Mysql添加用户,给用户授权

    万次阅读 多人点赞 2018-08-16 19:14:12
    创建用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; username – 你将创建的用户名说明: host – 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如 果想让该用户可以从...
  • 一,新建用户组 1.用户组文件  / etc / group,存储当前系统中所有用户组信息,格式:组名:组密码占位符:组编号:组中用户名列表  / etc / gshadow,存储当前系统中用户组的密码信息,格式:组名称:组密码:...
  • 微信小程序获取用户openid

    万次阅读 多人点赞 2018-03-26 17:12:53
    1、wx.login(OBJECT) 调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。2、code 换取 ...
  • PostgreSQL创建用户和超级用户

    千次阅读 2020-11-26 17:13:18
    普通用户 create role user1 with login password ‘123456’; 其中“user1”是用户名,“123456”是密码 超级用户 CREATE ROLE user1 superuser PASSWORD '123456' login; login 是赋予登录权限,否则是不能...
  • linux修改用户组,修改所属用户

    万次阅读 2019-08-15 17:56:00
    linux修改用户组,修改所属用户 实际开发中我们经常会需要新建文件夹,一般情况下,新建的文件或者文件夹都会在编辑器中,新建。然后,然后我们就继续开发了,访问的时候可能就会出现报错,无法访问等等问题。然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,611,287
精华内容 1,044,514
关键字:

用户