用戶登陸安全框架shiro—用戶的認證和受權(一)

    ssm整合shiro框架,對用戶的登陸操做進行認證和受權,目的很純粹就是爲了增長系統的安全線,至少不要輸在門檻上嘛。css

  這幾天在公司獨立開發一個供公司內部人員使用的小管理系統,客戶很少可是登陸一直都是簡單的校驗查詢,沒有使用任何安全框架來保駕護航,下午終於拿出之前的手段來完善了一下,將shiro安全框架與ssm整合使用的步驟和你們分享一下,都是些簡單易懂的東西,但願努力沒有白費,幫到你們。web

ssm整合shiro安全框架的步驟:算法

一、引入shiro安全框架的所需jar包spring

 1  <!-- shiro -->
 2         <dependency>
 3             <groupId>org.apache.shiro</groupId>
 4             <artifactId>shiro-core</artifactId>
 5             <version>1.2.3</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>org.apache.shiro</groupId>
 9             <artifactId>shiro-spring</artifactId>
10             <version>1.2.3</version>
11         </dependency>
12         <dependency>
13             <groupId>org.apache.shiro</groupId>
14             <artifactId>shiro-web</artifactId>
15             <version>1.2.3</version>
16         </dependency>
17         <dependency>
18             <groupId>org.apache.shiro</groupId>
19             <artifactId>shiro-ehcache</artifactId>
20             <version>1.2.3</version>
21         </dependency>

二、在web.xml文件中配置shiro攔截器apache

 1 <!-- spring整合安全框架 -->
 2     <filter>
 3         <filter-name>DelegatingFilterProxy</filter-name>
 4         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 5         <!-- 初始化參數 -->
 6         <init-param>
 7             <param-name>targetBeanName</param-name>
 8             <param-value>shiroFilter</param-value>
 9         </init-param>
10     </filter>
11     <filter-mapping>
12         <filter-name>DelegatingFilterProxy</filter-name>
13         <url-pattern>/*</url-pattern>
14     </filter-mapping>

三、建立spring整合shiro安全框架的配置文件applicationContext-shiro.xml(各位在拷貝的時候記得修改一下跳轉鏈接地址)安全

 1 <!-- shiro開啓事務註解 -->
 2     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
 3         <property name="securityManager" ref="securityManager" />
 4     </bean>
 5     
 6     <!-- 
 7         /**  除了已經設置的其餘路徑的認證
 8      -->
 9     <!-- shiro工廠bean配置 -->
10     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
11         <!-- shiro的核心安全接口 -->
12         <property name="securityManager" ref="securityManager"></property>
13         <!-- 要求登陸時的鏈接 -->
14         <property name="loginUrl" value="/login.jsp"></property>
15         <!-- 登陸成功後要跳轉的鏈接(此處已經在登陸中處理了) -->
16         <!-- <property name="successUrl" value="/index.jsp"></property> -->
17         <!-- 未認證時要跳轉的鏈接 -->
18         <property name="unauthorizedUrl" value="/refuse.jsp"></property>
19         <!-- shiro鏈接約束配置 -->
20         <property name="filterChainDefinitions">
21             <value>
22                 <!-- 對靜態資源設置容許匿名訪問 -->
23                 /images/** = anon
24                 /js/** = anon
25                 /css/** = anon
26                 <!-- 可匿名訪問路徑,例如:驗證碼、登陸鏈接、退出鏈接等 -->
27                 /auth/login = anon
28                 <!-- 剩餘其餘路徑,必須認證經過才能夠訪問 -->
29                 /** = authc
30             </value>
31         </property>
32     </bean>
33     
34     <!-- 配置shiro安全管理器 -->
35     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
36         <property name="realms" ref="customRealm"></property>
37     </bean>
38     
39     <!-- 自定義Realm -->
40     <bean id="customRealm" class="com.zxz.auth.realm.UserRealm">
41         <property name="credentialsMatcher" ref="credentialsMatcher"></property>
42     </bean>
43     
44     <!-- 配置憑證算法匹配器 -->
45     <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
46         <!-- Md5算法 -->
47         <property name="hashAlgorithmName" value="Md5"></property>
48     </bean>

【高能說明:以上倆個配置文件中加粗畫線的紅色部分必須一致,沒毛病。】session

  還須要說明的是,在上面的配置文件中shiro鏈接約束配置那塊,要特別當心,哥們我就在哪塊吃了2天的折磨虧,當時是隻配置了/** = authc,沒有配置可匿名訪問的路徑,當時是什麼狀況吧,就是無限次的調試無限次的修改,我是真長記性了,還有一點就是在配置的時候把你項目中的靜態資源放開,被屏蔽了啊,好心提醒,不謝。app

四、固然,在這以前,還要編寫自定義realm類,該類必須認AuthorizingRealm類作爸爸,否則你是不行滴,以後還有倆個兒子須要處理了,一個是認證另外一個受權,理論我就很少說了,MD沒用。框架

 1 public class UserRealm extends AuthorizingRealm {
 2     
 3     @Autowired
 4     private UserService userService;
 5     
 6     @Override
 7     public String getName() {
 8         return "customRealm";
 9     }
10     
11     /**
12      * 認證
13      */
14     @Override
15     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
16         // 獲取用戶名稱
17         String username = (String) token.getPrincipal();
18         User user = userService.findByUsername(username);
19         if (user == null) {
20             // 用戶名不存在拋出異常
21             System.out.println("認證:當前登陸的用戶不存在");
22             throw new UnknownAccountException();
23         }
24         String pwd = user.getPassword();
25         return new SimpleAuthenticationInfo(user, pwd, getName());
26     }
27 
28     /**
29      * 受權
30      */
31     @Override
32     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection princ) {
33         return null;
34     }
35 }

五、到這兒,shiro安全框架的整合是完成了,而後編寫action類來實現登陸功能,很少說了,直接上代碼。jsp

 1 /**
 2      * shiro框架登陸
 3      * @param user
 4      */
 5     @RequestMapping(value = "/login",method=RequestMethod.POST)
 6     public ModelAndView login(User user){
 7         // 表面校驗
 8         if(!StringUtil.isNullOrBlank(user.getUsername()) || !StringUtil.isNullOrBlank(user.getPassword())){
 9              return new ModelAndView("login")
10                      .addObject("message", "帳號或密碼不能爲空")
11                      .addObject("failuser", user);
12         }
13         // 獲取主體
14         Subject subject = SecurityUtils.getSubject();
15         try{
16             // 調用安全認證框架的登陸方法
17             subject.login(new UsernamePasswordToken(user.getUsername(), user.getPassword()));
18         }catch(AuthenticationException ex){
19             System.out.println("登錄失敗: " + ex.getMessage());
20             return new ModelAndView("login")
21                     .addObject("message", "用戶不存在")
22                     .addObject("failuser", user);
23         }
24         // 登陸成功後重定向到首頁
25         return new ModelAndView("redirect:/index");
26     }

  最後須要給你們說的就是,當某用戶登陸成功以後,shiro安全框架就會將用戶的信息存放在session中,你能夠經過User user = (User) SecurityUtils.getSubject().getPrincipal();這句代碼在任何地方任什麼時候候都能獲取當前登陸成功的用戶信息。

很終年間沒用shiro安全框架了,原理忘得都差很少了,可是駕馭它仍是沒問題的,若是哪兒寫的不對的,但願各位指教,儘管我脾氣很爆,哈哈哈。

相關文章
相關標籤/搜索