![【移动应用开发技术】springboot怎么整合shiro实现多验证登录功能_第1页](http://file4.renrendoc.com/view/55472f889445d18d941e59f538fdd05a/55472f889445d18d941e59f538fdd05a1.gif)
![【移动应用开发技术】springboot怎么整合shiro实现多验证登录功能_第2页](http://file4.renrendoc.com/view/55472f889445d18d941e59f538fdd05a/55472f889445d18d941e59f538fdd05a2.gif)
![【移动应用开发技术】springboot怎么整合shiro实现多验证登录功能_第3页](http://file4.renrendoc.com/view/55472f889445d18d941e59f538fdd05a/55472f889445d18d941e59f538fdd05a3.gif)
![【移动应用开发技术】springboot怎么整合shiro实现多验证登录功能_第4页](http://file4.renrendoc.com/view/55472f889445d18d941e59f538fdd05a/55472f889445d18d941e59f538fdd05a4.gif)
![【移动应用开发技术】springboot怎么整合shiro实现多验证登录功能_第5页](http://file4.renrendoc.com/view/55472f889445d18d941e59f538fdd05a/55472f889445d18d941e59f538fdd05a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】springboot怎么整合shiro实现多验证登录功能
这篇“springboot怎么整合shiro实现多验证登录功能”文章的知识点大部分人都不太理解,所以在下给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springboot怎么整合shiro实现多验证登录功能”文章吧。1.首先新建一个shiroConfigshiro的配置类,代码如下:@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代码如下:@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");
}使用过程中遇到的.apache.shiro.authc.UnknownAccountException:Realm[cn.tedu.wxacs.service.impl.ShioUserPhoneRealm@768d8431]wasunabletofindaccountdataforthesubmittedAuthenticationToken[org.apache.shiro.authc.UsernamePasswordToken-张三,rememberMe=false].org.apache.shiro.authc.UnknownAccountException:Realm[cn.tedu.wxacs.service.impl.ShioUserPhoneRealm@768d8431]wasunabletofindaccountdataforthesubmittedAuthenticationToken[org.apache.shiro.authc.UsernamePasswordToken-张三,rememberMe=false].出现这个问题是我的是因为Realm中的某个实现类没有加注解,我这儿演示时是应为ShiroUserRealm为加@Service注解2.org.apache.shiro.authc.AuthenticationException:Authenticationtokenoftype[classorg.apache.shiro.authc.UsernamePasswordToken]couldnotbeauthenticatedbyany
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年新教材高中地理第六章自然灾害1气象灾害课堂检测含解析新人教版必修1
- 辅导员试用期转正申请
- 房屋拆迁置换合同范本(2024版)
- 城市公共交通智能调度系统服务合同
- 高考化学三轮专题复习 考前体系通关 题型十九 物质结构与性质(选修专练)
- 在线教育课程设计与开发合同
- 建筑工程安全文明施工检查表(国标)
- 园林绿化工程承包协议
- 医院药品采购与库存管理流程
- 安装门洽谈合同范本
- 某某商业办公综合体海绵城市设计
- 集团企业如何对工资总额进行治理
- 技术2017MW1014一工区施工营地规划方案
- AD域功能介绍ppt课件
- 颈椎术后护理查房ppt课件
- 财务比率计算公式大全
- 平键键槽的尺寸与公差
- 《工程造价咨询服务收费管理暂行办法》
- 人体背面穴位超大图(真人女性)
- 钻孔压注水试验作业指导书
- 2021年“三重一大”集体决策制度执行情况效能监察实施方案与自查报告
评论
0/150
提交评论