1. 程式人生 > >SpringBoot學習筆記(五):SpringBoot整合lombok工具、SpringBoot整合Shiro安全框架

SpringBoot學習筆記(五):SpringBoot整合lombok工具、SpringBoot整合Shiro安全框架

SpringBoot整合lombok工具

什麼是lombok?
自動生成setget方法,建構函式,列印日誌
官網:http://projectlombok.org/features/index.
平時我們寫的一些重複程式碼,比如每個實體類的setter,getter方法,給每個類寫上Logger獲取的方法,這樣寫的話太繁瑣,我們就可以使用lombok的工具去簡化這個配置的操作。
首先先要在Eclipse下安裝lombok,在控制檯中,使用java -jar lombok.jar(lombok.jar 自己去網上下載)為eclipse安裝lombok外掛,安裝成功後需要重啟eclipse,在eclipse目錄下可以看到lombok.jar這個jar包,然後我們開啟eclipse.ini配置檔案檢視到如下程式碼就正確
在這裡插入圖片描述


然後我們需要在pom.xml中引入lombok的jar包了

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

部分註解說明,官網:http://projectlombok.org/features/index.

@Data   :註解在類上;提供類所有屬性的 getter 和 setter 方法,此外還提供了equals、canEqual、hashCode、toString 方法
@Setter:註解在屬性上;為屬性提供 setting 方法
@Getter:註解在屬性上;為屬性提供 getting 方法
@Log4j :註解在類上;為類提供一個 屬性名為log 的 log4j 日誌物件
@NoArgsConstructor:註解在類上;為類提供一個無參的構造方法
@AllArgsConstructor:註解在類上;為類提供一個全參的構造方法

SpringBoot整合Shiro安全框架

Apache Shiro是Java的一個安全框架。目前,使用Apache Shiro的人越來越多,因為它相當簡單,對比Spring Security,可能沒有Spring Security做的功能強大,但是在實際工作時可能並不需要那麼複雜的東西,所以使用小而簡單的Shiro就足夠了。對於它倆到底哪個好,這個不必糾結,能更簡單的解決專案問題就好了。
Shiro有哪些功能:身份認證/登入,授權,會話管理,加密,Web支援。。。。

記住這麼一點,Shiro不會去維護使用者、維護許可權;這些需要我們自己去設計/提供;通過Realm讓開發人員自己注入。
首先引入shiro相關jar包

<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.4.0</version>
</dependency>

然後在src/main/resources下新建一個關於shiro的快取配置檔案ehcache-shiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="cacheManagerConfigFile">
<defaultCache  
          maxElementsInMemory="10000"  
          eternal="false"  
          timeToIdleSeconds="120"  
          timeToLiveSeconds="120"  
          overflowToDisk="false"  
          diskPersistent="false"  
          diskExpiryThreadIntervalSeconds="120"
          memoryStoreEvictionPolicy="LRU"/>
 <cache name="shiro-activeSessionCache" 
   eternal="false"  
        maxElementsInMemory="10000"    
        overflowToDisk="false"  
        timeToIdleSeconds="0"  
        timeToLiveSeconds="0"
        statistics="true"/>  
</ehcache>

然後新建一個Shiro的配置檔案在com.majiaxueyuan.config包下ShiroConfig並註解@Configuration,這個配置只不過把最初的spring-shiro.xml形式的配置檔案轉成了java檔案,這個大家自己拿下去看下就明白意思了,內容和xml形式完全一致

@Configuration
public class ShiroConfiguration {
/**
* ShiroFilterFactoryBean 處理攔截資原始檔問題。
* 注意:單獨一個ShiroFilterFactoryBean配置是或報錯的,以為在
* 初始化ShiroFilterFactoryBean的時候需要注入:SecurityManager
* Filter Chain定義說明 1、一個URL可以配置多個Filter,使用逗號分隔 2、當設定多個過濾器時,全部驗證通過,才視為通過
* 3、部分過濾器可指定引數,如perms,roles
*/
@Bean
public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

// 必須設定 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);

// 攔截器.
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
//配置靜態資源允許訪問
filterChainDefinitionMap.put("/js/**","anon");
filterChainDefinitionMap.put("/css/**","anon");
filterChainDefinitionMap.put("/index","anon");
// <!-- authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問-->
filterChainDefinitionMap.put("/**", "authc");
// 如果不設定預設會自動尋找Web工程根目錄下的"/login.jsp"頁面
shiroFilterFactoryBean.setLoginUrl("/login");
// 未授權介面;
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
Map<String, Filter> filters=new HashMap<String,Filter>();
shiroFilterFactoryBean.setFilters(filters);
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}

@Bean
public EhCacheManager getEhCacheManager() {
EhCacheManager em = new EhCacheManager();
em.setCacheManagerConfigFile("classpath:ehcache-shiro.xml");
return em;
}
           // 開啟Controller中的shiro註解
@Bean
public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator();
daap.setProxyTargetClass(true);
return daap;
}
/**
* 配置org.apache.shiro.web.session.mgt.DefaultWebSessionManager
* @return
*/
@Bean
public DefaultWebSessionManager getDefaultWebSessionManager(){
DefaultWebSessionManager defaultWebSessionManager=new DefaultWebSessionManager();
defaultWebSessionManager.setSessionDAO(getMemorySessionDAO());
defaultWebSessionManager.setGlobalSessionTimeout(4200000);
defaultWebSessionManager.setSessionValidationSchedulerEnabled(true);
defaultWebSessionManager.setSessionIdCookieEnabled(true);
defaultWebSessionManager.setSessionIdCookie(getSimpleCookie());
return defaultWebSessionManager;
}
/**
* 配置org.apache.shiro.session.mgt.eis.MemorySessionDAO
* @return
*/
@Bean
public MemorySessionDAO getMemorySessionDAO(){
MemorySessionDAO memorySessionDAO=new MemorySessionDAO();
memorySessionDAO.setSessionIdGenerator(javaUuidSessionIdGenerator());
return memorySessionDAO;
}
@Bean
public JavaUuidSessionIdGenerator javaUuidSessionIdGenerator(){
return new JavaUuidSessionIdGenerator();
}
/**
* session自定義cookie名 
* @return
*/
@Bean
public SimpleCookie getSimpleCookie(){
SimpleCookie simpleCookie=new SimpleCookie();
simpleCookie.setName("security.session.id");
simpleCookie.setPath("/");
return simpleCookie;
}
@Bean
public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
           @Bean(name = "securityManager")
           public DefaultWebSecurityManager getDefaultWebSecurityManager(UserRealm userRealm) {
                       DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
                       dwsm.setRealm(userRealm);
                        //  <!-- 使用者授權/認證資訊Cache, 採用EhCache 快取 --> 
                       dwsm.setCacheManager(getEhCacheManager());
                       dwsm.setSessionManager(getDefaultWebSessionManager());
                       return dwsm;
             }
             //登入的時候必須走這裡
             //這裡開始會報錯,在下面建立相應的類。
@Bean
public UserRealm userRealm(EhCacheManager cacheManager) {
UserRealm userRealm = new UserRealm();
userRealm.setCacheManager(cacheManager);
return userRealm;
}
/**
* 開啟shrio註解支援
* @param userRealm
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(UserRealm userRealm){
AuthorizationAttributeSourceAdvisor aasa=new AuthorizationAttributeSourceAdvisor();
aasa.setSecurityManager(getDefaultWebSecurityManager(userRealm));
return aasa;
}
}

然後在com.realm寫一個UserRealm做登入許可權控制:
//在上面的配置檔案中有這個配置,需要引入這個類

public class UserRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 這裡做許可權控制
return null;
}
           @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 這裡做登入控制
return null;
}
}

我們這裡就在UserContrller裡面去使用我們的shiro進行登入許可權控制

UsernamePasswordToken token = new UsernamePasswordToken(username, password);
Security sccurity = SecurityUtils.getSubject();
sccurity.login(token);

這裡如果不丟擲異常證明登入成功。丟擲異常則證明賬號或者密碼錯誤。
這裡,基本上shiro的整合使用就到這裡了,關於shiro的基礎不是我們要用到了,我們這裡只是著重的要整合shiro到我們的SpringBooot裡面去。
在下一篇詳細寫shiro的登入控制、許可權控制。