下面开始使用Shiro实现带认证的登录操作
导入依赖
org.apache.shiro
shiro-core
1.3.2
org.apache.shiro
shiro-web
1.3.2
org.apache.shiro
shiro-spring
1.3.2
第一个demo
基本思路
用户输入的账号密码 和 数据库中存储的账号密码 比对
注意:shiro 默认不支持连接数据库 默认通过配置文件获取数据
所以我们要重写Realm中的方法,实现对数据库的连接
-
接收用户输入的账号密码,
-
要重写Realm中的方法,实现对数据库的连接和数据获取
-
写Springboot的配置类,创建并将重写的Realm设置放进去安全管理器, 将安全管理器 和Subject建立联系
-
将用户输入的账号密码给Subject
-
调用Subject的login方法完成登录
代码实现流程
重写Realm的代码
package com.macw.realm;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.macw.entity.Admin;
import com.macw.mapper.AdminMapper;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
/**
-
@author maCw
-
@version 1.0
-
@date 2019/8/22 16:13
*/
public class MyRealm extends AuthenticatingRealm {
@Resource
private AdminMapper adminMapper;
/**
- 记录日志
*/
Logger logger = LoggerFactory.getLogger(getClass());
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//1,获取令牌中的数据,账号
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
//2,通过账号查询获取数据库中对应的账号信息
Admin admin = adminMapper.selectOne(new QueryWrapper().eq(“username”, username));
logger.info(“—”+admin);
Subject subject = SecurityUtils.getSubject();
//将查询的对象放进去subject自带的session中去
subject.getSession().setAttribute(“admins”, admin);
//如果有数据,对象为非null,说明查询到了数据,封装account返回
if (admin != null){
SimpleAccount simpleAccount = new SimpleAccount(admin.getUsername(), admin.getPassword(), this.getName());
return simpleAccount;
}else {
//如果对象为空,return null就会抛出账户不存在异常
return null;
}
}
}
在SpringBoot中配置shiro
package com.macw.config;
import com.macw.realm.MyRealm;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.config.WebIniSecurityManagerFactory;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
/**
- @Configuration 标记当前类为配置类 相当于spring.xml
*/
@Configuration
public class ShiroConfig {
/**
-
@Bean 声明创建对象 并把对象放在工厂中 相当于bean标签
-
如果形参类型对应的对象在工厂中有 会自动装配上
-
@return
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultSecurityManager defaultSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
/**
- 过滤器链 过滤拦截规则 哪些页面拦截 哪些页面不拦截
*/
Map map = new HashMap();
/**
-
anon 代表匿名可访问 就是不用登录就可以访问 登录页面 登录的url
-
authc 认证可访问 代表登录后才能访问
-
支持通配符*
-
注意拦截规则 一个一个配置
*/
map.put(“/login.jsp”,“anon”);
map.put(“/login/*”,“anon”);
map.put(“/main/*”, “authc”);
map.put(“/guru/*”, “authc”);
map.put(“/menu/*”, “authc”);
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
/**
- 设置安全管理器,将创建的安全管理器放进shiroFilterFactoryBean过滤工厂里面
*/
shiroFilterFactoryBean.setSecurityManager(defaultSecurityManager);
return shiroFilterFactoryBean;
}
/**
-
创建安全管理器,并将自定义的Realm放进去管理器
-
@return
*/
@Bean
public DefaultSecurityManager getDefaultSecurityManager(MyRealm myRealm){
DefaultSecurityManager defaultSecurityManager = new DefaultWebSecurityManager();
// 需要赋值一个Realm
defaultSecurityManager.setRealm(myRealm);
return defaultSecurityManager;
}
/**
- 创建自定义的Realm
*/
@Bean
public MyRealm getMyRealm(){
return new MyRealm();
}
}
如果引用到其他项目的话这里需要修改的是 拦截规则 和 自定义的Realm
修改原来的登录方法
在控制器里的登录方法中修改:
/**
-
使用shiro登录
-
@param username
-
@param password
-
@return
*/
@RequestMapping(“adminLogin”)
public String adminLogin(String username,String password){
// 1.将用户输入的账号密码 封装在token中
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// 2.获取Subject
Subject subject = SecurityUtils.getSubject();
// 3.通过Subject 的login方法 完成登录
try {
subject.login(token);
//到这里如果没有异常说明登录成功,
return “redirect:/main/main.jsp”;
}catch (Exception e){
//有异常说明登录失败,重定向到登录页面
return “redirect:/login.jsp”;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
[外链图片转存中…(img-9URqKj2N-1713415100621)]
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
[外链图片转存中…(img-2u2Ixj7h-1713415100622)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
[外链图片转存中…(img-QNYFD9KT-1713415100622)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!