《一线大厂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
index
login
总结
其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。
这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来
目录:
部分内容截图:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
login
总结
其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。
这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来
目录:
[外链图片转存中…(img-aZutAbca-1714758053368)]
部分内容截图:
[外链图片转存中…(img-NdHfj6Qh-1714758053369)]
[外链图片转存中…(img-X5oES8r7-1714758053369)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!