小米java校招面试,springboot整合shiro

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

Title

index

退出

main

manage

administrator

login

Title

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

一线互联网大厂Java核心面试题库

image

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

一线互联网大厂Java核心面试题库

[外链图片转存中…(img-NqHu36xK-1713572699741)]

正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值