下面开始使用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开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-lEbTSReJ-1715078186978)]
[外链图片转存中…(img-08s8N3UZ-1715078186979)]
[外链图片转存中…(img-LFnHdWAZ-1715078186979)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!