shiro是什么?
- 官网:http://shiro.apache.org/
Shiro就是用来解决安全管理的系统化框架。- 它是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。
Shiro 核心组件
- 用户、角色、权限
- 给用户赋予角色,会给角色赋予权限。
UsernamePasswordToken:用来封装用户登录信息,使用用户的登录信息来创建令牌 Token。SecurityManager:核心部分,负责安全认证和授权。Suject: Shiro的一个抽象概念,包含了用户信息。Realm:开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在Realm中。AuthenticationInfo:用户的角色信息集合,认证时使用。AuthorzationInfo:角色的权限信息集合,授权时使用。DefaultWebSecurityManager:安全管理器,开发者自定义的Realm需要注入到DefaultWebSecurityManager进行管理才能生效。ShiroFilterFactoryBean:过滤器工厂,Shiro的基本运行机制是开发者定制规则,Shiro去执行,具体的执行操作就是由ShiroFilterFactoryBean创建的一个个 Filter 对象来完成。shiro工作流程

整合步骤
- 导入依赖
<!--shiro-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.2</version>
</dependency>
- 自定义
Realm过滤器,继承自AuthorizingRealm。
public class AccoutRealm extends AuthorizingRealm {
@Autowired
private AccountService accountService;
//做认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//客户端传过来的对象和密码,自动封装在token中,
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//根据用户名进行查询,并且判断
Account account = accountService.findByUsername(token.getUsername());
if (account != null){
//用户名不为空,继续验证密码
return new SimpleAuthenticationInfo(account,account.getPassword(),getName());
}
//用户名为空,直接跳出验证
return null;
}
//再授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取当前用户邓登陆的信息
Subject subject = SecurityUtils.getSubject();
Account account = (Account) subject.getPrincipal();
//设置角色
Set<String> roles = new HashSet<>();
roles.add(account.getRole());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);
//设置权限
info.addStringPermission(account.getPerms());
return info;
}
}
- 配置视图解析器
thymeleaf:
prefix: classpath:/templates/shiro/
suffix: .html
- 编写
ShiroConfig配置类
@Configuration
public class ShiroConfig {
//注入realm
@Bean
public AccountRealm accountRealm(){
return new AccountRealm();
}
//注入安全管理器
@Bean
public DefaultWebSecurityManager securityManager(@Qualifier("accountRealm") AccountRealm accountRealm){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(accountRealm);
return manager;
}
//注入工厂
@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");
return factoryBean;
//设置未授权页面
factoryBean.setUnauthorizedUrl("/unauth");
}
}
- 编写认证和授权规则,
shiro帮我们写好了,我们只需要选择就可以。 - 如果不想使用
shiro,直接将ShiroConfig上的@Configuration注释就可以了
认证过滤器
anon:无需认证。authc:必须认证。authcBasic:需要通过HTTPBasic认证。user:不一定通过认证,只要曾经被Shiro记录即可,比如:记住我。
授权过滤器
perms:必须拥有某个权限才能访问。role:必须拥有某个角色才能访问。port:请求的端口必须是指定值才可以。rest:请求必须基于 RESTful,POST、PUT、GET、DELETE。ssl:必须是安全的 URL 请求,协议 HTTPS。
thymeleaf整合shiro
- 导入依赖
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
- 在
shiro'Config中配置thymeleaf方言
//shiro整合thymeleaf,引进方言
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
- 在
html代码中引入命名空间,就可以使用shiro的标签了
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
382

被折叠的 条评论
为什么被折叠?



