微信第三方扫描登录 java源代码_微信开放平台基于网站应用授权登录源码(java)...

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

获取access_token时序图:

119591341_5_20171221120845459.png

微信网站应用授权登录接口对接代码实现:

需用的配置文件:

119591341_6_20171221120845850.png

需用的vo类:

119591341_7_20171221120846162.png

代码:

package com.thinkwin.common.vo;

/**

* 类名: WechatAccessTokenVo  * 描述: 授权关系接口的调用凭证模型 * 开发人员: weining  * 创建时间:  2017/5/5  */

public class WechatAccessTokenVo{

// 网页授权接口调用凭证

private String accessToken ;

// 凭证有效时长

private int expiresIn;

// 用于刷新凭证

private String refreshToken;

// 用户标识

private String openId;

// 用户授权作用域

private String scope;

// 用户全局唯一标识  unionid

private String unionid;

public String getAccessToken() {

return accessToken;

}

public void setAccessToken(String accessToken) {

this.accessToken = accessToken;

}

public int getExpiresIn() {

return expiresIn;

}

public void setExpiresIn(int expiresIn) {

this.expiresIn = expiresIn;

}

public String getRefreshToken() {

return refreshToken;

}

public void setRefreshToken(String refreshToken) {

this.refreshToken = refreshToken;

}

public String getOpenId() {

return openId;

}

public void setOpenId(String openId) {

this.openId = openId;

}

public String getScope() {

return scope;

}

public void setScope(String scope) {

this.scope = scope;

}

public String getUnionid() {

return unionid;

}

public void setUnionid(String unionid) {

this.unionid = unionid;

}

}

package com.thinkwin.common.vo;

import java.util.List;

/**

* 类名: WechatSNSUserInfoVo  * 描述: 通过网页授权获取的用户信息  * 开发人员: weining  * 创建时间:  2017/4/27  */

public class WechatSNSUserInfoVo {

// 用户标识

private String openId;

// 用户昵称

private String nickname;

// 性别(1是男性,2是女性,0是未知)

private int sex;

// 国家

private String country;

// 省份

private String province;

// 城市

private String city;

// 用户头像链接

private String headImgUrl;

// 用户特权信息

private List privilegeList;

// 用户全局唯一标识  unionid

private String unionid;

public String getOpenId() {

return openId;

}

public void setOpenId(String openId) {

this.openId = openId;

}

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 getHeadImgUrl() {

return headImgUrl;

}

public void setHeadImgUrl(String headImgUrl) {

this.headImgUrl = headImgUrl;

}

public List getPrivilegeList() {

return privilegeList;

}

public void setPrivilegeList(List privilegeList) {

this.privilegeList = privilegeList;

}

public String getUnionid() {

return unionid;

}

public void setUnionid(String unionid) {

this.unionid = unionid;

}

}

需要的工具类:

119591341_8_20171221120846209.png

代码 :

package com.thinkwin.common.utils.wechat;

import com.alibaba.fastjson.JSONObject;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSocketFactory;

import javax.net.ssl.TrustManager;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.ConnectException;

import java.net.URL;

/**

* 类名: WechatCommonUtil  * 描述: 微信登录通用工具类 * 开发人员: weining  * 创建时间:  2017/5/5  */

public class WechatCommonUtil {

private static Logger log = LoggerFactory.getLogger(WechatCommonUtil.class);

/**

* 发送https请求

*

* @param requestUrl 请求地址

* @param requestMethod 请求方式(GET、POST)

* @param outputStr 提交的数据

* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)

*/

public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {

JSONObject jsonObject = null;

try {

// 创建SSLContext对象,并使用我们指定的信任管理器初始化

TrustManager[] tm = { new WechatX509TrustManager() };

SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, new java.security.SecureRandom());

// 从上述SSLContext对象中得到SSLSocketFactory对象

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(requestUrl);

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

conn.setSSLSocketFactory(ssf);

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

// 设置请求方式(GET/POST)

conn.setRequestMethod(requestMethod);

// 当outputStr不为null时向输出流写数据

if (null != outputStr) {

OutputStream outputStream = conn.getOutputStream();

// 注意编码格式

outputStream.write(outputStr.getBytes("UTF-8"));

outputStream.close();

}

// 从输入流读取返回内容

InputStream inputStream = conn.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String str = null;

StringBuffer buffer = new StringBuffer();

while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

// 释放资源

bufferedReader.close();

inputStreamReader.close();

inputStream.close();

inputStream = null;

conn.disconnect();

jsonObject = JSONObject.parseObject(buffer.toString());

} catch (ConnectException ce) {

log.error("连接超时:{}", ce);

} catch (Exception e) {

log.error("https请求异常:{}", e);

}

return jsonObject;

}

}

package com.thinkwin.common.utils.wechat;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

/**

* 类名: WechatConfigLoader  * 描述: 微信初始化配置信息 * 开发人员: weining  * 创建时间:  2017/5/5  */

public class WechatConfigLoader {

//日志记录对象

private static Logger log = LoggerFactory.getLogger(WechatConfigLoader.class);

//配置文件路径

private static String wechatPath = "wechat.properties";

//开发平台应用唯一标识

private static String appId;

//开放平台应用密钥

private static String appSecret;

//微信第三方回调地址

private static String backUrl;

static {

// 类初始化后加载配置文件

InputStream in = WechatConfigLoader.class.getClassLoader()

.getResourceAsStream(wechatPath);

Properties props = new Properties();

try {

props.load(in);

} catch (IOException e) {

log.error("load wechat setting error,pleace check the file path:"

+ wechatPath);

log.error(e.toString(), e);

}

appId = props.getProperty("wechat.appId");

appSecret = props.getProperty("wechat.appSecret");

backUrl = props.getProperty("wechat.backUrl");

log.debug("load wechat setting success,file path:" + wechatPath);

}

public static String getAppId() {

return appId;

}

public static String getAppSecret() {

return appSecret;

}

public static String getBackUrl() {

return backUrl;

}

public static void setWechatPath(String wechatPath) {

WechatConfigLoader.wechatPath = wechatPath;

}

public static String getWechatPath() {

return wechatPath;

}

public static void setAppId(String appId) {

WechatConfigLoader.appId = appId;

}

public static void setAppSecret(String appSecret) {

WechatConfigLoader.appSecret = appSecret;

}

public static void setBackUrl(String backUrl) {

WechatConfigLoader.backUrl = backUrl;

}

}

package com.thinkwin.lehui.common.wechatUtil;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import com.thinkwin.lehui.common.wechatVo.WechatAccessTokenVo;

import com.thinkwin.lehui.common.wechatVo.WechatSNSUserInfoVo;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.net.URLEncoder;

import java.util.List;

/**

* 类名: WXOAuthProcess  * 描述: 微信第三方登录授权流程工具类 * 开发人员: weining  * 创建时间:  2017/5/5  */

public class WechatOAuthProcessUtil {

private static Logger log = LoggerFactory.getLogger(WechatOAuthProcessUtil.class);

/**

* 1.获取授权code

* @param req

* @param resp

*/

public static void getOAuthCode(HttpServletRequest req, HttpServletResponse resp){

String appId = WechatConfigLoader.getAppId();

String backUrl = WechatConfigLoader.getBackUrl();

String url="https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect";

url = url.replace("APPID",appId);

url = url.replace("REDIRECT_URI",URLEncoder.encode(backUrl));

try {

resp.sendRedirect(url);

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 2.获取授权调用token

* @param appId       开发平台应用唯一标识

* @param appSecret   开放平台应用密钥

* @param code        授权临时票据 根据code来换取accessToken

*/

public static WechatAccessTokenVo getOauthAccessToken(String appId, String appSecret, String code){

WechatAccessTokenVo wechatAccessTokenVo = null;

//拼接微信获取accessToken请求的链接

String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

url = url.replace("APPID",appId);

url = url.replace("SECRET",appSecret);

url = url.replace("CODE",code);

// 获取网页授权凭证 发送https请求

JSONObject jsonObject = (WechatCommonUtil.httpsRequest(url, "GET", null));

if (null != jsonObject) {

try {

wechatAccessTokenVo = new WechatAccessTokenVo();

wechatAccessTokenVo.setAccessToken(jsonObject.getString("access_token"));

wechatAccessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));

wechatAccessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));

wechatAccessTokenVo.setOpenId(jsonObject.getString("openid"));

wechatAccessTokenVo.setScope(jsonObject.getString("scope"));

wechatAccessTokenVo.setUnionid(jsonObject.getString("unionid"));

} catch (Exception e) {

wechatAccessTokenVo = null;

int errorCode = jsonObject.getInteger("errcode");

String errorMsg = jsonObject.getString("errmsg");

log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);

}

}

return wechatAccessTokenVo;

}

/**

* 3.通过网页授权获取用户信息

*

* @param accessToken 网页授权接口调用凭证

* @param openId 用户标识

* @return SNSUserInfo

*/

@SuppressWarnings( { "deprecation", "unchecked" })

public static WechatSNSUserInfoVo getSNSUserInfo(String accessToken, String openId) {

WechatSNSUserInfoVo snsUserInfo = null;

// 拼接请求地址 发送https请求

String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";

url = url.replace("ACCESS_TOKEN", accessToken);

url = url.replace("OPENID", openId);

// 通过网页授权获取用户信息

JSONObject jsonObject = WechatCommonUtil.httpsRequest(url, "GET", null);

if (null != jsonObject) {

try {

snsUserInfo = new WechatSNSUserInfoVo();

// 用户的标识

snsUserInfo.setOpenId(jsonObject.getString("openid"));

// 昵称

snsUserInfo.setNickname(jsonObject.getString("nickname"));

// 性别(1是男性,2是女性,0是未知)

snsUserInfo.setSex(jsonObject.getInteger("sex"));

// 用户所在国家

snsUserInfo.setCountry(jsonObject.getString("country"));

// 用户所在省份

snsUserInfo.setProvince(jsonObject.getString("province"));

// 用户所在城市

snsUserInfo.setCity(jsonObject.getString("city"));

// 用户头像

snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));

// 用户特权信息

snsUserInfo.setPrivilegeList(JSONArray.toJavaObject(jsonObject.getJSONArray("privilege"), List.class));

} catch (Exception e) {

snsUserInfo = null;

int errorCode = jsonObject.getInteger("errcode");

String errorMsg = jsonObject.getString("errmsg");

log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);

}

}

return snsUserInfo;

}

/**

* 刷新授权调用token

* @param appId       开发平台应用唯一标识

* @param refreshToken    通过access_token获取到的refresh_token参数

*/

public static WechatAccessTokenVo refreshAccessToken(String appId, String refreshToken){

WechatAccessTokenVo  wechatAccessTokenVo = null;

//拼接微信刷新accessToken请求的链接

String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";

url = url.replace("APPID",appId);

url = url.replace("REFRESH_TOKEN",refreshToken);

// 获取网页授权凭证 发送https请求

JSONObject jsonObject = WechatCommonUtil.httpsRequest(url, "GET", null);

if (null != jsonObject) {

try {

wechatAccessTokenVo = new WechatAccessTokenVo();

wechatAccessTokenVo.setAccessToken(jsonObject.getString("access_token"));

wechatAccessTokenVo.setExpiresIn(jsonObject.getInteger("expires_in"));

wechatAccessTokenVo.setRefreshToken(jsonObject.getString("refresh_token"));

wechatAccessTokenVo.setOpenId(jsonObject.getString("openid"));

wechatAccessTokenVo.setScope(jsonObject.getString("scope"));

} catch (Exception e) {

wechatAccessTokenVo = null;

int errorCode = jsonObject.getInteger("errcode");

String errorMsg = jsonObject.getString("errmsg");

log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);

}

}

return wechatAccessTokenVo;

}

}

package com.thinkwin.common.utils.wechat;

import javax.net.ssl.X509TrustManager;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

/**

* 类名: MyX509TrustManager  * 描述: 信任管理器   * 开发人员: weining  * 创建时间:  2017/5/5  */

public class WechatX509TrustManager implements X509TrustManager {

// 检查客户端证书

public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

}

// 检查服务器端证书

public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

}

// 返回受信任的X509证书数组

public X509Certificate[] getAcceptedIssuers() {

return new X509Certificate[0];

}

}

最后就是controller控制层代码:

/**

* 确认请求来自微信服务器  微信的回调

*/

@RequestMapping(value = "/oauthtest", method = RequestMethod.GET)

public String OAuthTest(HttpServletRequest request, HttpServletResponse response, Model model) throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

PrintWriter out = response.getWriter();

// 用户同意授权后,能获取到code

String code = request.getParameter("code");

String state = request.getParameter("state");

// 用户同意授权

if (!"authdeny".equals(code)) {

// 获取网页授权access_token

WechatAccessTokenVo wechatAccessTokenVo = WechatOAuthProcessUtil.getOauthAccessToken(code);

if(null == wechatAccessTokenVo){

if(state.equals("register")){

return "redirect:/system/wechatregisterpage";

}

return "redirect:/system/loginpage";

}

// 网页授权接口访问凭证

String accessToken = wechatAccessTokenVo.getAccessToken();

// 用户标识

String openId = wechatAccessTokenVo.getOpenId();

// 获取用户信息

WechatSNSUserInfoVo snsUserInfo = WechatOAuthProcessUtil.getSNSUserInfo(accessToken, openId);

Map map = new HashMap<>();

map.put("wechatAccessTokenVo",wechatAccessTokenVo);

map.put("snsUserInfo",snsUserInfo);

String s = JSON.toJSONString(map);

// 用户unionid

String unionId = snsUserInfo.getUnionid();

//把字符串存redis里面

RedisUtil.set("WeChat"+unionId,s);

//访问数据库操作

//直接登录

return "登录页";

}

return null;

}

到这里java基于微信开放平台的授权登录功能就完成了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java性能优化方案_Java性能优化要点

Java性能优化要点本文介绍如何通过以下几点从Java中挤压出性能&#xff0c;该大部分经验来自于Netty作者。JITJava即时编译器当Java执行runtime环境时&#xff0c;每遇到一个新的类&#xff0c;JIT编译器在此时就会针对这个类别进行编译(compile)被优化成相当精简的原生型指令码…

java注解 源码_详解Java注解教程及自定义注解

详解Java注解教程及自定义注解更新时间&#xff1a;2016-02-26 11:47:06 作者&#xff1a;佚名 我要评论(0)Java注解提供了关于代码的一些信息&#xff0c;但并不直接作用于它所注解的代码内容。在这个教程当中&#xff0c;我们将学习Java的注解&#xff0c;如何定制注解&…

win7卸载java_Win7彻底卸载Oracle 11g图文步骤(靠谱)

网上资料结合自己的操作整理出的一套靠谱的彻底卸载Oracle 11g的步骤&#xff01;(Win7)&#xff0c;具体内容详情如下所示&#xff1a;1&#xff1a;停掉所有Oracle相关的服务1.1打开服务方式如下&#xff1a;1.1.1&#xff1a;右击“计算机”–>管理–>服务和应用程序–…

vba与python相比2019_重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言

点击上方“CSDN”&#xff0c;选择“置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;如果微软的 Excel 中支持了人生苦短的 Python&#xff0c;你还会喜欢那个直接且易上手的 VBA 编程吗&#xff1f;近日&#xff0c;据国外媒体 BLEEPINGCOMPUTER 报道&#xff0c;微…

会话标识未更新 java_Appscan漏洞之会话标识未更新

本次针对 Appscan漏洞 会话标识未更新进行总结&#xff0c;如下&#xff1a;1. 会话标识未更新1.1、攻击原理在认证用户或者以其他方式建立新用户会话时&#xff0c;如果不使任何现有会话标识失效&#xff0c;攻击者就有机会窃取已认证的会话&#xff0c;此漏洞可结合XSS获取用…

arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots

作者:Esri### 作者邮箱:pythonesri.com### 首页:https://developers.arcgis.com/python/### 文档:None### 下载链接# ArcGIS API for PythonWork with maps and geospatial data in Python using The ArcGIS API for Python.Use simple and efficient tools powered by Web GIS…

linux es连接mysql_Linux下ES,kibana,mysql,kafka,zookeeper启动关闭方式

Linux下ES&#xff0c;kibana,mysql,kafka&#xff0c;zookeeper启动关闭方式ES前台方式启动切换到ES的bin目录下&#xff0c;执行./elasticsearch命令关闭窗口或者ctrlc会停止运行后台方式启动同样切换到ES的bin目录下&#xff0c;执行 ./elasticsearch -d 命令查看实时的日志…

java.util.timertask_java.util.TimerTask翻译

java.utilClass TimerTaskjava.lang.Objectjava.util.TimerTask All Implemented Interfaces:public abstract class TimerTaskextendsObjectimplementsRunnableA task that can be scheduled for one-time or repeated execution by a Timer. 由Timer安排执行一次或重复执行的…

java还值_Java到底是引用传递还是值传递

前言前段时间在群里看到类似这样一个问题&#xff0c;下面的代码会输出什么呢&#xff1f;public void test(){String str "hello";change(str);System.out.println(str);}private void change(String str){str "world";}当时看到这题&#xff0c;瞬间勾…

什么是java中的面向对象编程_什么是面向对象编程

什么是面向对象编程时间&#xff1a;2018-01-23 来源&#xff1a;面向对象编程讲解一.前言其实不管是java还是.net都是属于面向对象程序设计语言&#xff0c;归根结底&#xff0c;它们都离不开面向对象&#xff0c;所以什么是面向对象呢&#xff0c;意思就是object-oriente…

java如何给顺序表赋值_JAVA模拟新增顺序表及单链表

最近在回顾大学学的数据结构&#xff0c;这里给大家用javwww.cppcns.coma模拟顺序表和单链表的新增1顺序表新增/*** 顺序www.cppcns.com表** author cjd**/public class ArrayList {private Object[] elementData; // 底层是一个数组&#xff0c;目前还没有确定长度private int…

php浏览服务器某一文件夹内容,php删除web服务器中指定目录下的指定格式的文件...

今天还在写VipSystem Pro的授权部分&#xff0c;用户授权后&#xff0c;生成匹配该用户的唯一的php文件集合(在一个目录下)&#xff0c;然后进行zip下所并弹出下载。这个临时生成的zip文件存放在我指定的一个目录。每个用户授权不同的功能&#xff0c;都会产生一个唯一的zip压缩…

php escapeshellcmd,利用/绕过 PHP escapeshellarg/escapeshellcmd函数

escapeshellarg和escapeshellcmd的功能escapeshellarg1.确保用户只传递一个参数给命令2.用户不能指定更多的参数一个3.用户不能执行不同的命令escapeshellcmd1.确保用户只执行一个命令2.用户可以指定不限数量的参数3.用户不能执行不同的命令让我们用groups去打印组里每个userna…

php 绕waf,【技术分享】php webshell分析和绕过waf技巧

作者&#xff1a;阻圣预估稿费&#xff1a;400RMB(不服你也来投稿啊&#xff01;)投稿方式&#xff1a;发送邮件至linwei#360.cn&#xff0c;或登陆网页版在线投稿前言WebShell是攻击者使用的恶意脚本&#xff0c;它的用途主要是在攻击后的Web应用程序上建立持久性的后门。webs…

java 电子实时看板,看板界面的实现

在系统中有时通过以下界面可以直观的展示信息给用户:以上图形有几点比较重要&#xff1a;1&#xff0c; 一个面板显示一组属性(例如物料显示物料编号、物料规格)&#xff0c;但要把最主要的属性通过颜色单独处分出来。2&#xff0c; 通过颜色来区分重要性&#xff0c;例如(红…

php数组能不能静态,php 为什么常量可以用数组定义 静态变量却不能

<?php$GLOBALS[arr] array(1>1,2>2);define("ABC",$GLOBALS[arr][1]); # 这个定义可以class test{static $a $GLOBALS[arr][1]; # 这个初始化有语法错误}类的变量成员叫做“属性”&#xff0c;或者叫“字段”、“特征”&#xff0c;在本文档统一称为“属…

oracle asm 分布式存储,分布式数据中心数据库和存储部署解决方案

文/耿加申建设分布式双活数据中心是需要网络系统、存储系统、计算资源甚至包括应用系统等多个IT系统之间紧密合作才能实现的。用户所有的业务系统同时在两个数据中心运行&#xff0c;包括前端的全局负载均衡、服务器前端的负载均衡、服务器集群HA技术&#xff0c;后端的数据库系…

oracle中存储过程可见权限,Oracle数据库存储过程与权限

在执行存储过程时&#xff0c;我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时&#xff0c;定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后&#xff0c;便是调用者权限存储过程 他俩之间最根本的差异在于role能否在存…

magento php 所需模块,magento博客 - Magento2 创建基本模块

我们将在Magento 2中创建一个简单的模块&#xff0c;完成后&#xff0c;模块将在自定义前端路由的内容中显示“Hello world&#xff01;”。先决条件毋庸置疑&#xff0c;您需要最新的Magento 2版本在我们开始Magento 2模块开发之前&#xff0c;有两件事是人们经常忘记的&#…

手机安装linux不root权限管理,不root手机也能使用linux环境并安装msf等工具

抵挡不住物理键盘的诱惑在key2首发的时候下手了。黑莓的天性&#xff0c;不能root。之前用nexus习惯用linux deploy搭建的kali环境需要root权限&#xff0c;所以虽然key2敲命令很爽&#xff0c;但是不能使用linux deploy真的很可惜。然后找到了termux这个轻量化的神器。无需roo…