Shiro脚手架(整合SpringBoot)

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}

当然可以,以下是一份关于您的Java SpringBoot项目的简介描述: 探索JavaSpringBoot魔法 亲爱的开发者们,准备好一起踏上这次深入JavaSpringBoot之旅了吗?如果您正在寻找一个现代化、高效且易于扩展的开发框架,那么这个SpringBoot项目将是您的理想选择。 主要特点: 快速开发:SpringBoot通过自动配置和约定大于配置的原则,大大简化了项目设置和开发过程。 易于扩展:SpringBoot与生俱来的灵活性使您可以轻松集成各种服务和数据库,以满足您日益增长的需求。 安全性:内置的安全特性,如OAuth2和Spring Security,确保您的应用程序安全无虞。 微服务支持:SpringBoot是微服务架构的理想选择,可以帮助您构建模块化、可扩展的应用程序。 社区支持:全球的开发者社区意味着您可以在遇到问题时找到大量的资源和支持。 无论您是初出茅庐的Java新手,还是经验丰富的开发者,这个项目都将为您提供一个深入了解SpringBoot的机会。无论您是想学习新的技能,还是想提高现有应用程序的性能,这个项目都将是您的宝贵资源。 内容概览 项目设置和初始化 控制器设计和实现 数据持久化与数据库集成 安全性和身份验证 性能优化和监控 部署和生产环境考虑 现在,是时候让您的Java技能得到充分发挥,并掌握SpringBoot的魔法了!这个项目将带领您从基础到高级,探索SpringBoot的每一个角落。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值