美文网首页
SpringBoot+Shiro+thymeleaf

SpringBoot+Shiro+thymeleaf

作者: 煗NUAN | 来源:发表于2020-04-16 23:11 被阅读0次

    SpringBoot+Shiro+thymeleaf

    1.搭建SpringBoot项目

    01.jpg 02.jpg

    2.添加依赖

            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>1.4.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-web</artifactId>
                <version>1.4.2</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.2</version>
            </dependency>
            <!--整合thymeleaf-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.15</version>
            </dependency>
    
    • 添加依赖后的pom文件
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.ym</groupId>
        <artifactId>spring_boot_shiro</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
        <name>spring_boot_shiro</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>1.4.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-web</artifactId>
                <version>1.4.2</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.2</version>
            </dependency>
            <!--整合thymeleaf-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.15</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    3.配置application.yml文件

    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        url: jdbc:mysql://localhost:3307/rbac?useSSL=true&serverTimezone=UTC&characterEncoding=UTF-8
        username: root
        password: root
      thymeleaf:
        cache: false
    mybatis:
      type-aliases-package: com.ym.entity
      mapper-locations: classpath:mapper/*Mapper.xml
    

    4.MyRealm.java

    package com.ym.shiro;
    
    import com.ym.entity.Permission;
    import com.ym.entity.Role;
    import com.ym.entity.User;
    import com.ym.service.IUserService;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Component("myRealm")
    public class MyRealm extends AuthorizingRealm {
    
        @Resource
        private IUserService userService;
    
        //授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
            String username = getAvailablePrincipal(principalCollection).toString();
            List<Role> roles = userService.getAllRolesByUsername(username);
            for (Role role : roles) {
                info.addRole(role.getRname());
            }
    
            List<Permission> permissions = userService.getAllPermissionsByUsername(username);
            for (Permission permission : permissions) {
                info.addStringPermission(permission.getPname());
            }
    
            return info;
        }
    
        //认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    
            AuthenticationInfo info=null;
            UsernamePasswordToken token=(UsernamePasswordToken) authenticationToken;
    
            String username = token.getUsername();
            char[] password = token.getPassword();
            String pass=new String(password);
    
            User u = userService.login(username, pass);
    
            if (u!=null && u.getUid()!=0){
                String name = getName();
                info =new SimpleAuthenticationInfo(username,pass,name);
            }
    
            return info;
        }
    }
    

    5.ShiroConfig.java

    package com.ym.config;
    
    import com.ym.shiro.MyRealm;
    import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
    import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
    import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
    import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * ClassName: ShiroConfig
     * Description:
     * date: 2020/4/15  22:23
     *
     * @author YanM
     * @since JDK 1.8
     */
    @Configuration
    public class ShiroConfig {
    
        @Bean
        public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){
    
            ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
            shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
    
            Map<String,String> map=new HashMap<>();
    
            map.put("/login","anon");       //匿名用户访问login
            map.put("/main","roles[manager]");
    
            //修改拦截后返回/login页面
            shiroFilterFactoryBean.setLoginUrl("/login");
            //设置未授权的提示页面/unauth
            shiroFilterFactoryBean.setUnauthorizedUrl("/unauth");
    
            shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    
            return shiroFilterFactoryBean;
        }
    
        @Bean(name = "defaultWebSecurityManager")
        public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("myRealm") MyRealm realm){
            DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
    
            defaultWebSecurityManager.setRealm(realm);
    
            return defaultWebSecurityManager;
        }
    
        /**
         *  开启shiro的注解
         *   需要借助SpringAOP扫描Shiro注解的类,来进行安全校验
         * @return
         */
        @Bean
        public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
            DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
    
            advisorAutoProxyCreator.setProxyTargetClass(true);
    
            return advisorAutoProxyCreator;
        }
    
        /**
         * 开启aop的注解支持
         * @param defaultWebSecurityManager
         * @return
         */
        @Bean
        public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager defaultWebSecurityManager){
            AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor=new AuthorizationAttributeSourceAdvisor();
    
            authorizationAttributeSourceAdvisor.setSecurityManager(defaultWebSecurityManager);
    
            return authorizationAttributeSourceAdvisor;
        }
    }
    

    6.entity层的Javabean

    • User.java : 用户
    package com.ym.entity;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.Set;
    
    @Data
    public class User implements Serializable {
        private static final long serialVersionUID = 617289138502785533L;
        
        private Integer uid;
        
        private String username;
        
        private String password;
        
        private String tel;
        
        private String addr;
    
        private Set<Role> rs;
    }
    
    • Role.java : 角色
    package com.ym.entity;
    
    import lombok.Data;
    
    import java.io.Serializable;
    import java.util.Set;
    
    @Data
    public class Role implements Serializable {
        private static final long serialVersionUID = -74163700661732397L;
        
        private Integer rid;
        
        private String rname;
        
        private String rdesc;
    
        private Set<Permission> ps;
    }
    
    • Permission.java : 权限
    package com.ym.entity;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    @Data
    public class Permission implements Serializable {
        private static final long serialVersionUID = 581645870054218482L;
        
        private Integer pid;
        
        private String pname;
        
        private String pdesc;
    }
    

    7.dao层接口IUserDao

    package com.ym.dao;
    
    import com.ym.entity.Permission;
    import com.ym.entity.Role;
    import com.ym.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    
    import java.util.List;
    
    @Mapper
    public interface IUserDao {
    
        User login(@Param ("username") String username, @Param("password") String password);
    
        List<Role> getAllRolesByUsername(String username);
    
        List<Permission> getAllPermissionsByUsername(String username);
    }
    

    8.与dao层接口对应的mapper文件

    • UserMapper.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.ym.dao.IUserDao">
        <select id="login" resultType="User">
            select * from user where username=#{username} and password=#{password}
        </select>
    
        <select id="getAllRolesByUsername" resultType="Role">
            select r.* from user u
                inner JOIN user_role ur on u.uid = ur.uid
                inner join Role r on r.rid=ur.rid
                where u.username=#{username};
        </select>
    
        <select id="getAllPermissionsByUsername" resultType="Permission">
            select p.* from user u
                inner JOIN user_role ur on u.uid = ur.uid
                inner join Role r on r.rid=ur.rid
                INNER JOIN role_perms rp on r.rid = rp.rid
                INNER JOIN permission p on p.pid = rp.pid
                where u.username=#{username};
        </select>
    </mapper>
    

    9.service层接口与实现类

    • 接口 IUserService.java
    package com.ym.service;
    
    import com.ym.entity.Permission;
    import com.ym.entity.Role;
    import com.ym.entity.User;
    
    import java.util.List;
    
    public interface IUserService {
    
        User login(String username, String pass);
    
        List<Role> getAllRolesByUsername(String username);
    
        List<Permission> getAllPermissionsByUsername(String username);
    }
    
    
    • 实现类UserServiceImpl.java
    package com.ym.service.impl;
    
    import com.ym.dao.IUserDao;
    import com.ym.entity.Permission;
    import com.ym.entity.Role;
    import com.ym.entity.User;
    import com.ym.service.IUserService;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    @Service
    public class UserServiceImpl implements IUserService {
    
        @Resource
        private IUserDao userDao;
    
        @Override
        public User login(String username, String pass) {
            return userDao.login(username,pass);
        }
    
        @Override
        public List<Role> getAllRolesByUsername(String username) {
            return userDao.getAllRolesByUsername(username);
        }
    
        @Override
        public List<Permission> getAllPermissionsByUsername(String username) {
            return userDao.getAllPermissionsByUsername(username);
        }
    }
    

    10.controller层UserService.java

    package com.ym.controller;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.subject.Subject;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    
    @Controller
    public class UserController {
    
        @GetMapping("/")
        public String preLog(){
            return "login";
        }
    
        @PostMapping("/login")
        public String login(String username,String password){
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken token=new UsernamePasswordToken(username,password);
    
            try {
                subject.login(token);
                return "main";
            } catch (AuthenticationException e) {
                e.printStackTrace();
                return "login";
            }
        }
    }
    

    11.login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <h1>this is index page.</h1>
    
        <form action="login" method="post">
            username:<input type="text" name="username" /><p />
            password:<input type="text" name="password" /><p />
            <input type="submit" value="submit" /><p />
        </form>
    </body>
    </html>
    

    12.main.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>login</title>
    </head>
    <body>
        <h1>this is main page.</h1>
    </body>
    </html>
    

    13.目录结构

    SpringBoot+Shiro+thymeleaf目录结构.png

    相关文章

      网友评论

          本文标题:SpringBoot+Shiro+thymeleaf

          本文链接:https://www.haomeiwen.com/subject/ilojvhtx.html