针对微信小程序云开发-登录功能和账号密码登录这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展csdn账号密码登录剖析(模拟登录)、shiro整合shiro多验证登录(账号密码登录和使用手机验
针对微信小程序云开发-登录功能和账号密码登录这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展csdn账号密码登录剖析(模拟登录)、shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)、springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)、win10系统pin码登录消失不见只能使用账号密码登录解决方法等相关知识,希望可以帮助到你。
本文目录一览:- 微信小程序云开发-登录功能(账号密码登录)(微信小程序云开发用户登录)
- csdn账号密码登录剖析(模拟登录)
- shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)
- springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)
- win10系统pin码登录消失不见只能使用账号密码登录解决方法
微信小程序云开发-登录功能(账号密码登录)(微信小程序云开发用户登录)
一、新建页面
新建页面loadByAccount
二、代码实现
1、loadByAccount.w
1 <view>账号</view> 2 <input type="text" placeholder="请输入账号" bindinput="getAccount"></input> 3 <view>密码</view> 4 <input type="text" placeholder="请输入密码" bindinput="getPassword"></input> 5 <view> 6 <button type="primary" bindtap="loadByAccount">登录</button> 7 </view> 8 <view> 9 <view bindtap="toSign" >注册</view>10 </view>
2、loadByAccount.wxss
1 input{ 2 margin: 20rpx; 3 padding-left: 10rpx; 4 height: 80rpx; 5 border: 1rpx solid #c3c3c3; 6 } 7 view{ 8 margin: 20rpx; 9 }10 .btn{11 display: flex;12 margin-top: 50rpx;13 }14 .tosign{15 margin-top: 50rpx;16 text-align: center;17 }
3、loadByAccount.js
1 //自定义变量,存储用户输入的账号 2 let account = '''' 3 //自定义变量,存储用户输入的密码 4 let password = '''' 5 Page({ 6 7 //点击跳转到注册页 8 toSign(){ 9 wx.navigateTo({10 url: ''/pages/sign/sign'',11 })12 },13 14 //获取用户输入的账号、密码15 getAccount(e){16 console.log("用户输入的账号",e.detail.value);17 account = e.detail.val..............
csdn账号密码登录剖析(模拟登录)
大纲
前言
分析加密参数
uaToken
webUmidToken
发送模拟请求
对比解决障碍
浏览器发送
postman模仿
小结
编写代码
前言
很久以前研究过csdn的模拟登录,记得那个时候的csdn登录还是一个`form``表单,然后参杂着一些参数。使用遍历input元素把表单各个参数拿下来。存下直接post即可登陆成功。
前几天再次看了下亲爱的csdn。突然发现多了这连个参数。这就勾起了我的性趣和好奇心:我靠,就一年没见,csdn也搞这么一大串
加密
?并且以看两种加密方式还不一样哇?有点东西!下面就分享一下分析的过程!由于时间有限,只能每晚抽点时间研究,如果大家感觉不够深入或者讲的不好请谅解!
使用工具:
谷歌浏览器
postman发送请求调试
fidder抓包
分析加密参数
可以根据上图分析得知:有uaToken 和webUmidToken两个token。
分析参数肯定是要打断点的,一般有直接搜索,查看js调用堆栈,和hook查找找到参数位置。我是利用搜索找参数。
分析前先做好一些预备工作,多发几个请求,刷新页面。你会发现:
不刷新页面的话uaToken不会变化。
webUmidToken每次都不一样。
每次cookie不变。
uaToken
查找uaToken发现这段代码比较诡异。打断点debug。发现没错,这就是我们要找的!点击F11,进入子函数查看发生了什么。
进去发现它执行e()函数。再次F11查看。
通过校验发现e函数其实就是一个加密函数,关键是它跟我们的
核心数据(账号、cookie、密码等)无关
,所以这个加密数据空有其架势无作用。你可以保存一个直接一直使用一个(如果可逆后台可能会根据字符串进行校验是否符合规则)。
webUmidToken
每次刷新都会发现他在变化,鉴于前面的token都没啥作用,我大胆猜测,他也不影响登录!就先不debug分析了。
实际上他对结果也是没有影响的,这里就不进行分析,先发送请求!
发送模拟请求
通过浏览器的头发送请求信息。你会发现:
不管你怎么模拟都是各种错误
,要么类型错误
,要么繁忙
,要么类型错误。(可以看得出csdn是java后台,个人感觉接口异常处理的还有问题。暴露方法了)
对比解决障碍
有时候浏览器太过于局限。用fidder找到其中不同之处。用浏览器和postman发送请求找到其中参数的不同之处。
浏览器发送
postman模仿
你可以发现其中主要是格式区别,和部分头信息浏览器不显示需要加上。然后发送请求检验!
小结
后来发现其实那两个token,和cookie为空都没有关系!
cookie也没有限制,在登录时候根本不要cookie都可以。按理论来说应该进入页面返回一组cookie,用这个cookie访问登录接口有效才行,显然csdn没有。
分析一波约等于白分析,登录机制太简单了。
content-length别乱加,加错了它后台校验或出错
也就是登录著需要type,账号密码即可,其他设为空都行。要注意的就是
参数发送的格式!raw文本
。以后见到类似先
测试登录
,不能盲目分析
。虽然能够增加经验,但是有点浪费时间。。像csdn这次就是。。啥都没用。
编写代码
思路:访问登录接口,用返回的cookie访问我关注的人的文章!
import requests
from bs4 import BeautifulSoup
url=''https://passport.csdn.net/v1/register/pc/login/doLogin''
header={''user-agent'':''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'',
''referer'':''https://passport.csdn.net/login'',
''origin'':''https://passport.csdn.net'',
''content-Type'':''application/json;charset=UTF-8'',
''x-requested-with'':''XMLHttpRequest'',
''accept'':''application/json, text/plain, */*'',
''accept-encoding'':''gzip, deflate, br'',
''accept-language'':''zh-CN,zh;q=0.9'',
''connection'': ''keep-alive''
,''Host'': ''passport.csdn.net''
}
data=''{"loginType":"1","pwdOrVerifyCode":"你的密码",'' \
''"userIdentification":"你的账号","uaToken":"",'' \
''"webUmidToken":""}''
req=requests.post(url,data=data,headers=header)
cookies = requests.utils.dict_from_cookiejar(req.cookies)
res=req.text
print(res)
print(req.status_code)
print(cookies)
url2=''https://blog.csdn.net/nav/watchers''
req2=requests.get(url2,cookies=cookies)
soup=BeautifulSoup(req2.text,''lxml'')
print(soup.text)
如有错误请指教!
欢迎关注我的个人公众号:bigsai
推荐阅读
爬虫js解密—剖析网易云加密
浅谈网路爬虫
本文分享自微信公众号 - bigsai(bigsai)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)
1. 首先新建一个shiroConfig shiro的配置类,代码如下:
@Configuration是标识这个类是一个配置文件,在启动时会加载这个类里面的内容,这个配置文件的位置的一定一定一定不能防止启动类外面的文件夹中,否则还会在启动类上加注解
@Bean是将这个类交给spring管理
@Configuration
public class SpringShiroConfig {
/**
* @param realms 这儿使用接口集合是为了实现多验证登录时使用的
* @return
*/
@Bean
public SecurityManager securityManager(Collection<Realm> realms) {
DefaultWebSecurityManager sManager = new DefaultWebSecurityManager();
sManager.setRealms(realms);
return sManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactory(SecurityManager securityManager) {
ShiroFilterFactoryBean sfBean = new ShiroFilterFactoryBean();
sfBean.setSecurityManager(securityManager);
//如果是匿名访问时,访问了不能访问的资源跳转的位置
sfBean.setLoginUrl("/index");
//定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)
LinkedHashMap<String, String> map = new LinkedHashMap<>();
//静态资源允许匿名访问:"anon" 静态资源授权时不能写static下面所有的开放,要将static下面的所有文件夹一个一个的开放,templates同理
//map的key可以为文件的位置,也可以为请求的路径
map.put("/bower_components/**", "anon");
map.put("/json/**", "anon");
map.put("/pages", "anon");
map.put("/user/userPasswordLogin", "anon");
map.put("/user/login", "anon");
map.put("/user/reg", "anon");
//访问这个路径时不会进入controller,会在这儿直接拦截退出,问为什么的,自己想请求流程去
map.put("/user/userLogout", "logout");
//拦截除上面之外的所有请求路径
map.put("/**", "user");
sfBean.setFilterChainDefinitionMap(map);
return sfBean;
}
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
2. 写Realms的实现类,一般继承自AuthorizingRealm(这个是实现用户名,密码登录),代码如下:
@Service
public class ShioUserRealm extends AuthorizingRealm {
//注入userdao
@Autowired
private UserDao userDao;
/**
* 设置凭证匹配器
*
* @param credentialsMatcher
*/
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
/*这里设置了MD5盐值加密,这儿就必须使用HashedCredentialsMatcher才能有下面两个方法*/
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
//这里是设置加密方式
matcher.setHashAlgorithmName("MD5");
//这里是设置加密的次数
matcher.setHashIterations(2);
super.setCredentialsMatcher(matcher);
}
/**
* 这儿是设置授权的
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 通过此方法完成认证数据的获取及封装,系统底层会将认证数据传递认证管理器,有认证管理器完成认证操作
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//先判断这个是否是来及这个令牌的数据:我们这儿分为了UsernamePasswordToken(shiro给我们提供的。)、UserPhoneToken
if (!(authenticationToken instanceof UsernamePasswordToken)) {
return null;
}
//获取controller传过来的数据
UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;
//upToken.setRememberMe(true);shiro默认为false,是是否记住我的功能
//这儿为用户提交的username
String username = upToken.getUsername();
//去数据更加name取到用户的信息
User user = userDao.findUserByUserName(username);
//判断数据库是否有这用户
if (user == null) {
throw new UnknownAccountException();
}
//判断用户的状态是否被禁用(数据库的字段)
if (user.getState() == 0) {
throw new LockedAccountException();
}
//这儿是取到用户信息中的盐值,盐值要转换为ByteSource这个类型才能使用
ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt());
//这儿是将这个用户的信息交给shiro(user为用户对象,user.getPassword()是要加密的对象,credentialsSalt为盐值,getName()当前对象)
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), credentialsSalt, getName());
return info;
}
}
3. 此时用户的账号密码登录已经可以使用了controller代码如下:
@RequestMapping("userPasswordLogin")
@ResponseBody
public JsonResult userPasswordLogin(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
return new JsonResult("login Ok");
}
4. 我们现在来实现短信验证码登录实现:
4.1 先写UserPhoneToken,我放在l和springShiroConfig同一目录下:
@Component
public class UserPhoneToken extends UsernamePasswordToken implements Serializable {
private static final long serialVersionUID = 6293390033867929958L;
// 手机号码
private String phoneNum;
//无参构造
public UserPhoneToken(){}
//获取存入的值
@Override
public Object getPrincipal() {
if (phoneNum == null) {
return getUsername();
} else {
return getPhoneNum();
}
}
@Override
public Object getCredentials() {
if (phoneNum == null) {
return getPassword();
}else {
return "ok";
}
}
public UserPhoneToken(String phoneNum) {
this.phoneNum = phoneNum;
}
public UserPhoneToken(final String userName, final String password) {
super(userName, password);
}
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
@Override
public String toString() {
return "PhoneToken [PhoneNum=" + phoneNum + "]";
}
}
4.2 在写shiroUserPhoneRealm,代码如下:
@Service
public class ShioUserPhoneRealm extends AuthorizingRealm {
@Autowired
private UserDao userDao;
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
//这儿的CredentialsMatcher的new的对象必须是AllowAllCredentialsMatcher
CredentialsMatcher matcher = new AllowAllCredentialsMatcher();
super.setCredentialsMatcher(matcher);
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 通过此方法完成认证数据的获取及封装,系统底层会将认证数据传递认证管理器,有认证管理器完成认证操作
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UserPhoneToken token = null;
if (authenticationToken instanceof UserPhoneToken) {
token = (UserPhoneToken) authenticationToken;
}else {
return null;
}
//获取我发送验证码是存入session中的验证码和手机号
String verificationCode = (String) SecurityUtils.getSubject().getSession().getAttribute("verificationCode");
String phone = (String) SecurityUtils.getSubject().getSession().getAttribute("phone");
//获取controller传过来的数据
String verificationCode1 = (String) token.getPrincipal();
//去数据库根据手机号查询用户信息
User user = userDao.findUserByUserPhone(phone);
if (StringUtils.isEmpty(verificationCode)) {
throw new ServiceException("网络错误");
}
//比对手机号
if (!verificationCode.equals(verificationCode1)) {
throw new ServiceException("验证码不正确");
}
if (user == null) {
throw new UnknownAccountException();
}
if (user.getState() == 0) {
throw new LockedAccountException();
}
return new SimpleAuthenticationInfo(user,phone,getName());
}
}
4.3 手机号码登录验证已经基本完成:controller代码如下:
password为接收的验证码
@PostMapping("verificationCodeLogin")
@ResponseBody
public JsonResult verificationCodeLogin(String password) {
Subject subject = SecurityUtils.getSubject();
UserPhoneToken token = new UserPhoneToken(password);
subject.login(token);
return new JsonResult("login OK");
}
使用过程中遇到的bug
1.
org.apache.shiro.authc.UnknownAccountException: Realm [cn.tedu.wxacs.service.impl.ShioUserPhoneRealm@768d8431] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - 张三, rememberMe=false].
出现这个问题是我的是因为Realm中的某个实现类没有加注解,我这儿演示时是应为ShiroUserRealm为加@Service注解
2.
org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms. Please ensure that at least one realm can authenticate these tokens.
这儿出现的问题是应为我的ShioUserRealm的AuthenticationInfo方法的User user = userDao.findUserByUserName(username);这行代码出现的问题,debug的时候就发现这一句执行后就保错
原因:是因为我的application.yml文件中没有写dao对应的mapper文件的路径
3. 在ShioUserPhoneRealm的doGetAuthenticationInfo方法的new SimpleAuthenticationInfo(user,phone,getName())这个位置后就报错是应为ShioUserPhoneRealm的这个方法中你没有将new的对象设置为AllowAllCredentialsMatcher();
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
//这儿的CredentialsMatcher的new的对象必须是AllowAllCredentialsMatcher
CredentialsMatcher matcher = new AllowAllCredentialsMatcher();
super.setCredentialsMatcher(matcher);
}
注解中有一些需要注意的地方,建议看看,注解不对的地方还希望在下放评论指出或者联系我
应为我的知识有限,此方法本人实现目前没有问题,其中有什么不对的地方还希望各位指出,谢谢!
使用的是jdk8,spring boot 的2.2.1版本,shiro的1,.4.1版本
springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)
这篇文章给大家介绍springboot整合shiro多验证登录功能的实现方法,包括账号密码登录和使用手机验证码登录功能,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
1. 首先新建一个shiroConfig shiro的配置类,代码如下:
@Configuration public class SpringShiroConfig { /** * @param realms 这儿使用接口集合是为了实现多验证登录时使用的 * @return */ @Bean public SecurityManager securityManager(Collection realms) { DefaultWebSecurityManager sManager = new DefaultWebSecurityManager(); sManager.setRealms(realms); return sManager; } @Bean public ShiroFilterfactorybean shiroFilterFactory(SecurityManager securityManager) { ShiroFilterfactorybean sfBean = new ShiroFilterfactorybean(); sfBean.setSecurityManager(securityManager); //如果是匿名访问时,访问了不能访问的资源跳转的位置 sfBean.setLoginUrl("/index"); //定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问) LinkedHashMap map = new LinkedHashMap(); //静态资源允许匿名访问:"anon" 静态资源授权时不能写static下面所有的开放,要将static下面的所有文件夹一个一个的开放,templates同理 //map的key可以为文件的位置,也可以为请求的路径 map.put("/bower_components/**", "anon"); map.put("/json/**", "anon"); map.put("/pages", "anon"); map.put("/user/userPasswordLogin", "anon"); map.put("/user/login", "anon"); map.put("/user/reg", "anon"); //访问这个路径时不会进入controller,会在这儿直接拦截退出,问为什么的,自己想请求流程去 map.put("/user/userlogout", "logout"); //拦截除上面之外的所有请求路径 map.put("/**", "user"); sfBean.setFilterChainDeFinitionMap(map); return sfBean; } @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); }
2. 写Realms的实现类,一般继承自AuthorizingRealm(这个是实现用户名,密码登录),代码如下:
@Service public class ShIoUserRealm extends AuthorizingRealm { //注入userdao @Autowired private UserDao userDao; /** * 设置凭证匹配器 * * @param credentialsMatcher */ @Override public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { /*这里设置了MD5盐值加密,这儿就必须使用HashedCredentialsMatcher才能有下面两个方法*/ HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(); //这里是设置加密方式 matcher.setHashAlgorithmName("MD5"); //这里是设置加密的次数 matcher.setHashIterations(2); super.setCredentialsMatcher(matcher); } /** * 这儿是设置授权的 * @param principalCollection * @return */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } /** * 通过此方法完成认证数据的获取及封装,系统底层会将认证数据传递认证管理器,有认证管理器完成认证操作 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { //先判断这个是否是来及这个令牌的数据:我们这儿分为了UsernamePasswordToken(shiro给我们提供的。)、UserPhonetoken if (!(authenticationToken instanceof UsernamePasswordToken)) { return null; } //获取controller传过来的数据 UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken; //upToken.setRememberMe(true);shiro默认为false,是是否记住我的功能 //这儿为用户提交的username String username = upToken.getUsername(); //去数据更加name取到用户的信息 User user = userDao.findUserByUserName(username); //判断数据库是否有这用户 if (user == null) { throw new UnkNownAccountException(); } //判断用户的状态是否被禁用(数据库的字段) if (user.getState() == 0) { throw new LockedAccountException(); } //这儿是取到用户信息中的盐值,盐值要转换为ByteSource这个类型才能使用 ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt()); //这儿是将这个用户的信息交给shiro(user为用户对象,user.getpassword()是要加密的对象,credentialsSalt为盐值,getName()当前对象) SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getpassword(), credentialsSalt, getName()); return info; } }
3. 此时用户的账号密码登录已经可以使用了controller代码如下:
@RequestMapping("userPasswordLogin") @ResponseBody public JsonResult userPasswordLogin(String username, String password) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); subject.login(token); return new JsonResult("login Ok"); }
4. 我们现在来实现短信验证码登录实现:
4.1 先写UserPhonetoken,我放在l和springShiroConfig同一目录下:
@Component public class UserPhonetoken extends UsernamePasswordToken implements Serializable { private static final long serialVersionUID = 6293390033867929958L; // 手机号码 private String phoneNum; //无参构造 public UserPhonetoken(){} //获取存入的值 @Override public Object getPrincipal() { if (phoneNum == null) { return getUsername(); } else { return getPhoneNum(); } } @Override public Object getCredentials() { if (phoneNum == null) { return getpassword(); }else { return "ok"; } } public UserPhonetoken(String phoneNum) { this.phoneNum = phoneNum; } public UserPhonetoken(final String userName, final String password) { super(userName, password); } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } @Override public String toString() { return "Phonetoken [PhoneNum=" + phoneNum + "]"; } }
4.2 在写shiroUserPhoneRealm,代码如下:
@Service public class ShIoUserPhoneRealm extends AuthorizingRealm { @Autowired private UserDao userDao; @Override public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { //这儿的CredentialsMatcher的new的对象必须是AllowAllCredentialsMatcher CredentialsMatcher matcher = new AllowAllCredentialsMatcher(); super.setCredentialsMatcher(matcher); } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { return null; } /** * 通过此方法完成认证数据的获取及封装,系统底层会将认证数据传递认证管理器,有认证管理器完成认证操作 * @param authenticationToken * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UserPhonetoken token = null; if (authenticationToken instanceof UserPhonetoken) { token = (UserPhonetoken) authenticationToken; }else { return null; } //获取我发送验证码是存入session中的验证码和手机号 String verificationCode = (String) SecurityUtils.getSubject().getSession().getAttribute("verificationCode"); String phone = (String) SecurityUtils.getSubject().getSession().getAttribute("phone"); //获取controller传过来的数据 String verificationCode1 = (String) token.getPrincipal(); //去数据库根据手机号查询用户信息 User user = userDao.findUserByUserPhone(phone); if (StringUtils.isEmpty(verificationCode)) { throw new ServiceException("网络错误"); } //比对手机号 if (!verificationCode.equals(verificationCode1)) { throw new ServiceException("验证码不正确"); } if (user == null) { throw new UnkNownAccountException(); } if (user.getState() == 0) { throw new LockedAccountException(); } return new SimpleAuthenticationInfo(user,phone,getName()); } }
4.3 手机号码登录验证已经基本完成:controller代码如下:
@PostMapping("verificationCodeLogin") @ResponseBody public JsonResult verificationCodeLogin(String password) { Subject subject = SecurityUtils.getSubject(); UserPhonetoken token = new UserPhonetoken(password); subject.login(token); return new JsonResult("login OK"); }
使用过程中遇到的bug
1.
org.apache.shiro.authc.UnkNownAccountException: Realm [cn.tedu.wxacs.service.impl.ShIoUserPhoneRealm@768d8431] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - 张三, rememberMe=false].
出现这个问题是我的是因为Realm中的某个实现类没有加注解,我这儿演示时是应为ShiroUserRealm为加@Service注解
2.
org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] Could not be authenticated by any configured realms. Please ensure that at least one realm can authenticate these tokens.
这儿出现的问题是应为我的ShIoUserRealm的AuthenticationInfo方法的User user = userDao.findUserByUserName(username);这行代码出现的问题,debug的时候就发现这一句执行后就保错
原因:是因为我的application.yml文件中没有写dao对应的mapper文件的路径
3. 在ShIoUserPhoneRealm的doGetAuthenticationInfo方法的new SimpleAuthenticationInfo(user,phone,getName())这个位置后就报错是应为ShIoUserPhoneRealm的这个方法中你没有将new的对象设置为AllowAllCredentialsMatcher();
@Override public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { //这儿的CredentialsMatcher的new的对象必须是AllowAllCredentialsMatcher CredentialsMatcher matcher = new AllowAllCredentialsMatcher(); super.setCredentialsMatcher(matcher); }
注解中有一些需要注意的地方,建议看看,注解不对的地方还希望在下放评论指出或者联系我
应为我的知识有限,此方法本人实现目前没有问题,其中有什么不对的地方还希望各位指出,谢谢!
使用的是jdk8,spring boot 的2.2.1版本,shiro的1,.4.1版本
到此这篇关于springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)的文章就介绍到这了,更多相关springboot整合shiro验证登录内容请搜索小编以前的文章或继续浏览下面的相关文章希望大家以后多多支持小编!
win10系统pin码登录消失不见只能使用账号密码登录解决方法
导读:(win10系统pin码登录消失不见只能使用账号密码登录该怎么办?)相关电脑教程分享。
win10专业版系统pin码登录消失不见只能使用账号密码登录该怎么办?最近使用win10专业版系统的用户反应原本设置了Pin码登录,但是有一天突然无法使用Pin码进行登录,无法显示输入密码的界面,在尝试了之后我设置的Pin就没有了,设置里登陆设置的也是只是一片白,弹出输入密码界面可能要尝试2~3次,只有Microsoft账户密码可用,这是为什么呢?遇到这样问题大家可以查看本文中小编分享的几个服务是否正常运行。win10无法使用Pin码登录的解决方法:1、鼠标右键开始菜单,选择【计算机管理】(或win+R打开运行,键入:services.msc 直接打开服务);
2、在左侧点击【服务和应用程序】--【服务】;
3、接着我们在右侧查看Credential Manager、Base Filtering Engine、Windows Biometric Service、IPsec Policy Agent服务是否正常启动,将其启动类型设置成自动并将其启动后尝试注销重新测试是否有Pin码登录!由于Pin码登录需要以上介绍的服务启动才能正常使用,所以无法正常使用的用户可先将上述的几个服务进行启动一般即可解决问题!
总结
以上是小编为你收集整理的win10系统pin码登录消失不见只能使用账号密码登录解决方法全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
今天的关于微信小程序云开发-登录功能和账号密码登录的分享已经结束,谢谢您的关注,如果想了解更多关于csdn账号密码登录剖析(模拟登录)、shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)、springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)、win10系统pin码登录消失不见只能使用账号密码登录解决方法的相关知识,请在本站进行查询。
本文标签: