springboot整合shiro

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
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

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

部分内容截图:


《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

login

Title

总结

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。

这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来

目录:

[外链图片转存中…(img-aZutAbca-1714758053368)]

部分内容截图:

[外链图片转存中…(img-NdHfj6Qh-1714758053369)]

[外链图片转存中…(img-X5oES8r7-1714758053369)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值