當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Shiro与Springboot整合:配置依赖改造登录方法
生活随笔
收集整理的這篇文章主要介紹了
Shiro与Springboot整合:配置依赖改造登录方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.learn</groupId><artifactId>shiro_springboot</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><fastjson.version>1.2.47</fastjson.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-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.16</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--shiro與spring整合 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version></dependency><!--shiro與redis整合實現sessionDao --><dependency><groupId>org.crazycake</groupId><artifactId>shiro-redis</artifactId><version>3.0.0</version></dependency></dependencies><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><snapshots><enabled>true</enabled></snapshots></repository><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories><pluginRepositories><pluginRepository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><snapshots><enabled>true</enabled></snapshots></pluginRepository><pluginRepository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories><build><plugins><!--編譯插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>${java.version}</source><target>${java.version}</target></configuration></plugin><!--單元測試插件--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build>
</project>
package cn.learn.shiro.controller;import cn.learn.shiro.domain.User;
import cn.learn.shiro.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;
import java.util.Enumeration;@RestController
public class UserController {@Autowiredprivate UserService userService;//個人主頁//使用shiro注解鑒權//@RequiresPermissions() -- 訪問此方法必須具備的權限//@RequiresRoles() -- 訪問此方法必須具備的角色/*** 1.過濾器:如果權限信息不匹配setUnauthorizedUrl地址* 2.注解:如果權限信息不匹配,拋出異常*/@RequiresPermissions("user-home")@RequestMapping(value = "/user/home")public String home() {return "訪問個人主頁成功";}//添加@RequestMapping(value = "/user",method = RequestMethod.POST)public String add() {return "添加用戶成功";}//查詢@RequestMapping(value = "/user",method = RequestMethod.GET)public String find() {return "查詢用戶成功";}//更新@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)public String update(String id) {return "更新用戶成功";}//刪除@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)public String delete() {return "刪除用戶成功";}/*** 1.傳統登錄* 前端發送登錄請求 => 接口部分獲取用戶名密碼 => 程序員在接口部分手動控制* 2.shiro登錄* 前端發送登錄請求 => 接口部分獲取用戶名密碼 => 通過subject.login => realm域的認證方法**///用戶登錄@RequestMapping(value="/login")public String login(String username,String password) {//構造登錄令牌try {/*** 密碼加密:* shiro提供的md5加密* Md5Hash:* 參數一:加密的內容* 111111 --- abcd* 參數二:鹽(加密的混淆字符串)(用戶登錄的用戶名)* 111111+混淆字符串* 參數三:加密次數**/password = new Md5Hash(password,username,3).toString();UsernamePasswordToken upToken = new UsernamePasswordToken(username,password);//1.獲取subjectSubject subject = SecurityUtils.getSubject();//獲取sessionString sid = (String) subject.getSession().getId();//2.調用subject進行登錄subject.login(upToken);return "登錄成功";}catch (Exception e) {return "用戶名或密碼錯誤";}}
}
package cn.learn.shiro.dao;import cn.learn.shiro.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;/***?用戶數據訪問接口*/
public interface UserDao extends JpaRepository<User, String>, JpaSpecificationExecutor<User> {//根據手機號獲取用戶信息User findByUsername(String name);
}
package cn.learn.shiro.domain;import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;@Entity
@Table(name = "pe_permission")
@Getter
@Setter
@NoArgsConstructor
public class Permission implements Serializable {private static final long serialVersionUID = -4990810027542971546L;/*** 主鍵*/@Idprivate String id;private String name;private String code;private String description;
}
package cn.learn.shiro.domain;import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;@Entity
@Table(name = "pe_role")
@Getter
@Setter
public class Role implements Serializable {private static final long serialVersionUID = 594829320797158219L;@Idprivate String id;private String name;private String description;//角色與用戶 多對多@ManyToMany(mappedBy="roles")private Set<User> users = new HashSet<User>(0);//角色與權限 多對多@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name="pe_role_permission",joinColumns={@JoinColumn(name="role_id",referencedColumnName="id")},inverseJoinColumns={@JoinColumn(name="permission_id",referencedColumnName="id")})private Set<Permission> permissions = new HashSet<Permission>(0);
}
package cn.learn.shiro.domain;import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;/*** 用戶實體類*/
@Entity
@Table(name = "pe_user")
@Getter
@Setter
public class User implements Serializable {private static final long serialVersionUID = 4297464181093070302L;/*** ID*/@Idprivate String id;private String username;private String password;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name="pe_user_role",joinColumns={@JoinColumn(name="user_id",referencedColumnName="id")},inverseJoinColumns={@JoinColumn(name="role_id",referencedColumnName="id")})private Set<Role> roles = new HashSet<Role>();//用戶與角色 多對多
}
package cn.learn.shiro.service;import cn.learn.shiro.dao.UserDao;
import cn.learn.shiro.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserDao userDao;public User findByName(String name) {return this.userDao.findByUsername(name);}public List<User> findAll() {return userDao.findAll();}
}
package cn.learn.shiro;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;@SpringBootApplication(scanBasePackages = "cn.learn")
@EntityScan("cn.learn.shiro.domain")
public class ShiroApplication {public static void main(String[] args) {SpringApplication.run(ShiroApplication.class, args);}@Beanpublic OpenEntityManagerInViewFilter openEntityManagerInViewFilter() {return new OpenEntityManagerInViewFilter();}}
server:port: 8081
spring:application:name: ihrm-company #指定服務名datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/shiro_db?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456jpa:database: MySQLshow-sql: trueopen-in-view: trueredis:host: 127.0.0.1port: 6379
?
總結
以上是生活随笔為你收集整理的Shiro与Springboot整合:配置依赖改造登录方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shiro认证与授权:自定义realm
- 下一篇: shiro的会话管理:介绍