SessionManager:如果写过 Servlet 就应该知道 Session 的概念,Session 需要有人去管理它的生命周期,这个组件就是 SessionManager。而 Shiro 并不仅仅可以用在 Web 环境,也可以用在如普通的 JavaSE 环境
编写认证和授权规则:
认证过滤器
anon:无需认证。
authc:必须认证。
authcBasic:需要通过 HTTPBasic 认证。
user:不一定通过认证,只要曾经被 Shiro 记录即可,比如:记住我。
授权过滤器
perms:必须拥有某个权限才能访问。
role:必须拥有某个角色才能访问。
port:请求的端口必须是指定值才可以。
rest:请求必须基于 RESTful,POST、PUT、GET、DELETE。
ssl:必须是安全的 URL 请求,协议 HTTPS。
项目创建
所需要的依赖
检测依赖是否有冲突
项目骨架
entity
@Data
public class Account {
private Integer id;
private String username;
private String password;
private String perms;
private String role;
}
mapper
@Repository
public interface AccountMapper extends BaseMapper {
controller
@Controller
public class AccountController {
@GetMapping(“/{url}”)
public String redirect(@PathVariable(“url”) String url){
return url;
}
// 传过来的数据封装到token 用subject调用 逻辑交给shiro管理
@PostMapping(“/login”)
public String login(String username, String password, Model model){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username,password);
try {
subject.login(token);
Account account = (Account) subject.getPrincipal();
subject.getSession().setAttribute(“account”,account);
return “index”;
} catch (UnknownAccountException e) {
e.printStackTrace();
model.addAttribute(“msg”,“用户名错误!”);
return “login”;
} catch (IncorrectCredentialsException e){
model.addAttribute(“msg”,“密码错误!”);
e.printStackTrace();
return “login”;
}
}
@GetMapping(“/unauth”)
@ResponseBody
public String unauth(){
return “未授权,无法访问!”;
}
@GetMapping(“/logout”)
public String logout(){
Subject subject = SecurityUtils.getSubject();
subject.logout();
return “login”;
}
}
config
@Configuration
//注解是生效配置类 去掉注释 配置类不在生效
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier(“securityManager”) DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
//权限设置
Map<String,String> map = new Hashtable<>();
map.put(“/main”,“authc”);
map.put(“/manage”,“perms[manage]”);
map.put(“/administrator”,“roles[administrator]”);
factoryBean.setFilterChainDefinitionMap(map);
//设置登录页面
factoryBean.setLoginUrl(“/login”);
//设置未授权页面
factoryBean.setUnauthorizedUrl(“/unauth”);
return factoryBean;
}
@Bean
//ioc容器中拿到accoutealm 依据名字进行查询 然后注入到manager
public DefaultWebSecurityManager securityManager(@Qualifier(“accoutRealm”) AccoutRealm accoutRealm){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(accoutRealm);
return manager;
}
@Bean
//放到ioc容器中
public AccoutRealm accoutRealm(){
return new AccoutRealm();
}
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
}
AccoutRealm
public class AccoutRealm extends AuthorizingRealm {
@Autowired
private AccountService accountService;
/**
-
授权
-
@param principalCollection
-
@return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取当前登录的用户信息
Subject subject = SecurityUtils.getSubject();
Account account = (Account) subject.getPrincipal();
//设置角色
Set roles = new HashSet<>();
roles.add(account.getRole());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
//设置权限
info.addStringPermission(account.getPerms());
return info;
}
/**
-
认证
-
@param authenticationToken
-
@return
-
@throws AuthenticationException
*/
//先认证然后在进行的权限的判定
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 生成token 这个是用户在前端输入的用户名和密码
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
// 在token中拿到用户输入的用书名于数据库中用户进行对比有的话执行没有抛出一样
Account account = accountService.findByUsername(token.getUsername());
if(account != null){
// 验证密码 数据库中查出密码和传过来的密码进行对比 下面对象会自动的将token中的密码和正确的密码对比验证
return new SimpleAuthenticationInfo(account,account.getPassword(),getName());
}
return null;
}
}
要在启动类加上mapper注解扫描
pom文件
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
org.apache.shiro
shiro-spring
1.5.3
mysql
mysql-connector-java
com.baomidou
mybatis-plus-boot-starter
3.3.1.tmp
com.github.theborakompanioni
thymeleaf-extras-shiro
2.0.0
静态页面
index
index
login
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/962a13f4cd920c3c6c4d6019e810ac11.jpeg)
一线互联网大厂Java核心面试题库
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
课程,基本涵盖了95%以上Java开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/962a13f4cd920c3c6c4d6019e810ac11.jpeg)
一线互联网大厂Java核心面试题库
[外链图片转存中…(img-NqHu36xK-1713572699741)]
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!