springboot+shiro+layuimini实现后台管理系统的权限控制(一)基础环境搭建

一、框架简介

springboot自然不必要多说,是现在主流的web框架;

layuimini是一款基于layui的后台管理系统前端框架,简单易上手,功能也比较齐全,适合后台开发人员使用。

Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的 Shiro 就足够了。对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问题就好了。

二、环境搭建

1、新建springboot项目,并在pom中导入相关的依赖:

 ​​​​​

        <!--springboot支持thymeleaf-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
        </dependency>

        <!--shiro-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.7.1</version>
        </dependency>

        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>

        <!--druid数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <!-- log4j-->
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--编码工具包-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.14</version>
        </dependency>

        <!-- gson-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>


        <!--thymeleaf支持shiro-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

2、构建Springboot项目框架:

2、配置application.yml

server:
  port: 8080   #端口号

spring:
  #数据源设置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://xxxx:3306/test_shiro?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
    username: root
    password: ****
    druid:
      initial-size: 10     #初始化连接池大小
      min-idle: 10         #最小大小
      max-active: 50       #最大大小
      max-wait: 60000      #获取连接时最大等待时间,单位毫秒
      time-between-eviction-runs-millis: 60000   #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      min-evictable-idle-time-millis: 300000     #配置一个连接在池中最小生存的时间,单位是毫秒
      validation-query: SELECT 1 FROM DUAL       #用来检测连接是否有效的sql
      test-while-idle: true                      #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
      testOnBorrow: false                        #获取连接时执行检测,建议关闭,影响性能
      testOnReturn: false                        #归还连接时执行检测,建议关闭,影响性能
      pool-prepared-statements: false            #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
      filters: stat,wall                   #配置扩展插件,常用的插件有=>stat:监控统计  log4j:日志  wall:防御sql注入
  #thymeleaf设置 prefix:指定模板页面存放路径;suffix:指定模板页面名称的后缀;cache:模板缓存
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    cache: false
# mybatis设置 mapper-locations:mapper扫描路径;type-aliases-package:model扫描路径,设置以后,mapper中的resultType可以不用全路径
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.demo.model

logging:
  level:
    com.example.demo.mapper: trace

3、导入layuimini;

下载地址:layui-mini: layuimini,后台admin前端模板,基于 layui 编写的最简洁、易用的后台框架模板。只需提供一个接口就直接初始化整个框架,无需复杂操作。 - Gitee.com

 解压出来的结构是这样的:

基本上就是普通web前端的项目结构,唯一要说明的一点就是api文件夹,api文件夹下放的是静态的json文件,用来渲染数据用的, 后面我们会用接口来替换掉。

我们把它引入到我们的项目中,静态资源都放在static下,页面文件都放在templates下:

4、前后端联通

在controller包下新建PageController用来绑定页面:

@Controller
public class PageController {

    @RequestMapping("/")
    public String index() {
        return "/index";
    }
}

因为我们引进了thymeleaf作为模板引擎,所以这里return不需要加.html。

然后我们就可以点击一下运行,看一下效果:

 菜单模块已经加载出来了,但是点击菜单返回的都是提示404。原因在于目前菜单的数据都是通过api文件夹下init.json加载出来的,我们查看这个文件发现,这里的href都是带.html,之前已经说过我们使用的是thymeleaf模板引擎,无法加载后缀名为html的路径,因此如果我们需要将这里的href的后缀都去掉,并且在controller中将href与页面进行绑定:

@Controller
public class PageController {

    @RequestMapping("/")
    public String index() {
        return "/index";
    }

    @RequestMapping("/page/welcome-1")
    public String welcome1() {
        return "/page/welcome-1";
    }
}

再次点击运行,我们就能看到主页一被加载出来了:

 好了,至此我们就完成了基础环境的搭建,shiro环境已经被我们引入,并且layuimini也可以作为项目的前端来进行使用了。下一篇,我们就将实现利用shiro实现对登录用户的认证。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring BootShiro 都是非常流行的Java开发框架。其中,Spring Boot是一个快速开发框架,能够快速地搭建一个Web应用程序;而Shiro是一个强大的安全框架,提供了认证、授权、加密、会话管理等安全相关的功能。 下面是实现Spring BootShiro权限管理的步骤: 1. 引入依赖 在pom.xml文件中引入Spring BootShiro的依赖。 ``` <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.0</version> </dependency> ``` 2. 编写Shiro配置类 编写一个Shiro配置类,用于配置Shiro的安全管理器、Realm、过滤器等。 ``` @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 设置过滤器链 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); // 登录页面 shiroFilterFactoryBean.setLoginUrl("/login"); // 认证成功后跳转页面 shiroFilterFactoryBean.setSuccessUrl("/index"); // 未授权页面 shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized"); return shiroFilterFactoryBean; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm()); return securityManager; } @Bean public Realm realm() { return new MyRealm(); } } ``` 3. 编写Realm 编写一个Realm类,用于进行认证和授权。 ``` public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; // 认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; String username = token.getUsername(); User user = userService.getUserByUsername(username); if (user == null) { throw new UnknownAccountException("用户不存在"); } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } // 授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { String username = (String) principalCollection.getPrimaryPrincipal(); User user = userService.getUserByUsername(username); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.addRoles(user.getRoles()); authorizationInfo.addStringPermissions(user.getPermissions()); return authorizationInfo; } } ``` 4. 编写Controller 编写一个Controller类,用于处理用户登录、登出等请求。 ``` @Controller public class LoginController { @GetMapping("/login") public String login() { return "login"; } @PostMapping("/login") public String doLogin(String username, String password, boolean rememberMe) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); token.setRememberMe(rememberMe); try { subject.login(token); return "redirect:/index"; } catch (AuthenticationException e) { return "login"; } } @GetMapping("/logout") public String logout() { Subject subject = SecurityUtils.getSubject(); subject.logout(); return "redirect:/login"; } @GetMapping("/index") public String index() { return "index"; } @GetMapping("/unauthorized") public String unauthorized() { return "unauthorized"; } } ``` 5. 编写页面 编写登录页面、首页、未授权页面等页面。 ``` <!-- 登录页面 --> <form method="post" action="/login"> <input type="text" name="username" placeholder="用户名" required> <input type="password" name="password" placeholder="密码" required> <div> <input type="checkbox" name="rememberMe" id="rememberMe"> <label for="rememberMe">记住我</label> </div> <button type="submit">登录</button> </form> <!-- 首页 --> <h1>欢迎访问首页</h1> <!-- 未授权页面 --> <h1>您没有访问该页面的权限</h1> ``` 以上就是Spring BootShiro权限管理的实现步骤。通过配置Shiro的安全管理器、Realm、过滤器等,可以实现用户认证和授权。同时,通过在Controller中处理用户登录、登出等请求,可以实现用户的登录和退出功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值