shiro整合MyBatis實現用戶登錄認證。

創建SpringBoot項目。

導入依賴:

<dependencies>

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </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>
    <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.5.2</version>
    </dependency>


    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.22</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>

</dependencies>

配置application.yml

spring:
  datasource:
    username: root
    password: 154269564
    #時區報錯----》serverTimezone=UTC
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    #指定數據庫類型
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true

    #配置監控統計攔截的filters,stat:監控統計、log4j:日誌記錄、wall:防禦sql注入
    #如果允許時報錯  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #則導入 log4j 依賴即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

  thymeleaf:
    cache: false

#配置mybatis
mybatis:
  type-aliases-package: com.qi.pojo
  mapper-locations: classpath:mapper/*.xml

創建實體類User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
}

創建Dao層

@Mapper
@Repository
public interface UserMapper {
    User queryUserByName(String name);
}

創建service層

@Service
@Resource
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryUserByName(String name){
        return userMapper.queryUserByName(name);
    }
}

創建Mapper.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.qi.Dao.UserMapper">

    <select id="queryUserByName" parameterType="String" resultType="User">
        select * from user where name = #{name}
    </select>

</mapper>

測試Mybatis:

@SpringBootTest
class Spring07ShiroApplicationTests {
    @Autowired
    UserService userService;
    @Test
    void contextLoads() {
        System.out.println(userService.queryUserByName("sdf"));
    }
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qg4nNlnp-1588822311579)(SpringBoot.assets/image-20200507112651420.png)]

連接數據庫成功。

部分前端頁面:

<h1>
    登錄頁面
</h1>
<p th:text="${msg}" style="color: red"></p>
<form th:action="@{/login}" method="post">
    用戶名:<input type="text" name="username"/>
    密碼:<input type="text" name="pwd"/>
    <input type="submit" value="登錄">
</form>

Controller層:

//獲取用戶名和密碼
@RequestMapping("/login")
public String login(String username, String pwd, Model model){
    //獲取當前用戶
    Subject subject = SecurityUtils.getSubject();
    //封裝用戶登錄信息
    UsernamePasswordToken token = new UsernamePasswordToken(username, pwd);
    try {
        subject.login(token);
        return "index";
    }catch (UnknownAccountException e){
        model.addAttribute("msg","用戶名錯誤");
        return "login";
    }catch (IncorrectCredentialsException e){
        model.addAttribute("msg","密碼錯誤");
        return "login";
    }
}

shrio的認證管理:

public class UserRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;
    //授權
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("執行了授權--->doGetAuthorizationInfo");
        return null;
    }

    //認證
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken Token) throws AuthenticationException {
        System.out.println("執行了認證--->doGetAuthorizationInfo");
        
        UsernamePasswordToken token = (UsernamePasswordToken) Token;
        //連接真實數據庫
        User user = userService.queryUserByName(token.getUsername());
        if(user==null){
            return null;//拋出異常:UnknownAccountException
        }
        //密碼驗證,交給shiiro做
        //加密: md5:3def184ad8f4755ff269862ea77393dd
        // md5鹽值加密:3def184ad8f4755ff269862ea77393dd+username
        System.out.println(user);
        return new SimpleAuthenticationInfo("",user.getPwd(),"");
    }
}

之後可以對密碼進行MD5加密。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章