pom.xml 导入maven依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.9.0</version>
</dependency>
可以使用yaml配置访问路径
shiro:
loginUrl: /myController/login
配置自己的Realm类,Service业务对象需要使用自己所写的
@Component
public class MyRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//自定义授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
List<String> roles=userService.getRolesByUSername(principalCollection.getPrimaryPrincipal().toString());
List<String> permissions=userService.getPermissionsByUSername(principalCollection.getPrimaryPrincipal().toString());
//用户所拥有的角色
info.addRoles(roles);
System.out.println("当前用户所拥有的角色"+roles);
//用户所拥有的权限
info.addStringPermissions(permissions);
System.out.println("当前用户所拥有的权限"+permissions);
return info;
}
//自定义登录方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//1、获取用户信息、得到用户名
String name = authenticationToken.getPrincipal().toString();
//2、调用数据库
User user = userService.getUserInfoByName(name);
//进行业务判断
if (user != null) {
//用户名 密码 加盐参数 用户名称
AuthenticationInfo info=new SimpleAuthenticationInfo(
authenticationToken.getPrincipal(),
user.getPwd(),
ByteSource.Util.bytes("salt"),
authenticationToken.getPrincipal().toString()
);
return info;
}
return null;
}
}
Shiro的配置类 ShiroConfig ,Realm需要使用自己写的
@Configuration
public class ShiroConfig {
@Autowired
MyRealm myRealm;
//配置SecurityManager
//配置单个realm的认证实现原理
@Bean
public DefaultWebSecurityManager defaultWebSecurityManager(){
//1 创建 defaultWebSecurityManager对象
DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
//2 创建 加密对象 (加盐已经在 realm中设置 )
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
matcher.setHashAlgorithmName("md5");
matcher.setHashIterations(3);
//3 将加密对象存储到myrealm
myRealm.setCredentialsMatcher(matcher);
//4 myrealm存入 defaultWebSecurityManager对象
defaultWebSecurityManager.setRealm(myRealm);
//设置rememberMe
defaultWebSecurityManager.setRememberMeManager(rememberMeManager());
defaultWebSecurityManager.setCacheManager(getEhCacheManager());
//返回 defaultWebSecurityManager对象
return defaultWebSecurityManager;
}
//配置 Shiro 内置过滤器拦截范围
@Bean
public DefaultShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition definition = new
DefaultShiroFilterChainDefinition();
//设置不认证可以访问的资源
definition.addPathDefinition("/myController/userLogin", "anon");
definition.addPathDefinition("/myController/login", "anon");
//设置登出操作,位置放在下面两个起前面
definition.addPathDefinition("/logout","logout");
//设置需要进行登录认证的拦截范围
definition.addPathDefinition("/**", "authc");
//添加存在用户的过滤器(rememberMe)
definition.addPathDefinition("/**","user");
return definition;
}
@Bean
public ShiroDialect shiroDialect(){
return new ShiroDialect();
}
//cookie 属性设置
public SimpleCookie rememberMeCookie(){
SimpleCookie cookie = new SimpleCookie("rememberMe");
//设置跨域
//cookie.setDomain(domain);
cookie.setPath("/");
cookie.setHttpOnly(true);
cookie.setMaxAge(30*24*60*60);
return cookie;
}
//创建 Shiro 的 cookie 管理对象
public CookieRememberMeManager rememberMeManager(){
CookieRememberMeManager cookieRememberMeManager = new
CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
cookieRememberMeManager.setCipherKey("1234567890987654".getBytes());
return cookieRememberMeManager;
}
//缓存管理器
public EhCacheManager getEhCacheManager(){
EhCacheManager ehCacheManager = new EhCacheManager();
InputStream is = null;
try {
is = ResourceUtils.getInputStreamForPath(
"classpath:ehcache/ehcache-shiro.xml");
} catch (IOException e) {
e.printStackTrace();
}
CacheManager cacheManager = new CacheManager(is);
ehCacheManager.setCacheManager(cacheManager);
return ehCacheManager;
}
//配置多个realm的认证实现原理
// @Bean
// public DefaultWebSecurityManager defaultWebSecurityManager() {
//
// //创建defaultWebSecurityManager
// DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
// //创建认证对象,设置认证策略
// ModularRealmAuthenticator modularRealmAuthenticator = new ModularRealmAuthenticator();
// //设置认证策略
// // AllSuccessfulStrategy 所有 Realm 成功,认证才视为成功
// // FirstSuccessfulStrategy 第一个 Realm 验证成功,整体认证将视为成功,且后续 Realm 将被忽略
// // AtLeastOneSuccessfulStrategy 只要有一个(或更多)的 Realm 验证成功,那么认证将视为成功
// modularRealmAuthenticator.setAuthenticationStrategy(new AllSuccessfulStrategy());
// //将认证对象 存入 defaultWebSecurityManager对象
// defaultWebSecurityManager.setAuthenticator(modularRealmAuthenticator);
//
// //设置rememberMe
// defaultWebSecurityManager.setRememberMeManager(rememberMeManager());
//
// //封装 myRealm 集合 、可以存入多个Realm
// List<Realm> list = new ArrayList<>();
// list.add(myRealm);
// //将 myRealm集合 存入 defaultWebSecurityManager 对象
// defaultWebSecurityManager.setRealms(list);
// // 返回
// return defaultWebSecurityManager;
//
// }
}
简单权限系统建表sql
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '用户名',
`pwd` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '密码',
`rid` bigint NULL DEFAULT NULL COMMENT '角色编号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;
CREATE TABLE `role` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` VARCHAR(30) DEFAULT NULL COMMENT '角色名',
`desc` VARCHAR(50) DEFAULT NULL COMMENT '描述',
`realname` VARCHAR(20) DEFAULT NULL COMMENT '角色显示名',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='角色表';
CREATE TABLE `permissions` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` VARCHAR(30) DEFAULT NULL COMMENT '权限名',
`info` VARCHAR(30) DEFAULT NULL COMMENT '权限信息',
`desc` VARCHAR(50) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='权限表';
CREATE TABLE `role_user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`uid` BIGINT(20) DEFAULT NULL COMMENT '用户 id',
`rid` BIGINT(20) DEFAULT NULL COMMENT '角色 id',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='角色用户映射
表';
CREATE TABLE `role_ps` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
`rid` BIGINT(20) DEFAULT NULL COMMENT '角色 id',
`pid` BIGINT(20) DEFAULT NULL COMMENT '权限 id',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='角色权限映射
表';
多表查询sql
-- 查询角色sql
SELECT c.name FROM user a INNER JOIN role_user b on a.uid =b.uid
INNER JOIN role c on b.rid=c.rid where a.name =#{name}
--查询权限sql
SELECT e.info FROM user a
INNER JOIN role_user b on a.uid =b.uid
INNER JOIN role c on b.rid=c.rid
INNER JOIN role_ps d on d.rid=c.rid
INNER JOIN permissions e on e.pid=d.pid
where a.name =#{name}