shiro 權限控制框架 入門級實例(一)加密、登錄驗證

shiro 權限控制框架 入門級實例 加密、登錄驗證

    應項目要求,最近詳細瞭解了下shiro權限控制框架,從一臉懵逼到略有所得再到啥也不會,我還是走了許多彎路。。。感慨天真無知太年輕,基礎較爲薄弱的我,很多東西研究了好久才弄明白些,怕自己太浪哪一天忘了怎麼用了,遂來到這裏,寫篇博文,以爲記。

直接上代碼:

一、控制層
@Controller
public class userAction {

@Autowired
private userService us;

@RequestMapping(value="/login.do",method=RequestMethod.POST)
    public String login(TLogin user, HttpServletRequest request) {
        // 獲取subject對象
        Subject subject = SecurityUtils.getSubject();
        // 實例化用戶名密碼令牌
        UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
        try {
            // 使用subject對象進行登陸
            subject.login(token);
            // 獲取session
            Session session = subject.getSession();
            // 輸出session
            System.out.println("sessionId:" + session.getId() + ";sessionHost:" + session.getHost() +";sessionTimeout:%s" + session.getTimeout());
            session.setAttribute("info", "session的數據");
//            if (subject.isPermitted("所有權限")) {
// return "success";
// }
//            if (subject.isPermitted("主管權限")) {
// return "success";
// }
//            if (subject.isPermitted("普通權限")) {
// return "success";
// }
            return "success";
        } catch (Exception e) {
            // 驗證失敗
            e.printStackTrace();
            request.setAttribute("user", user);
            request.setAttribute("errorMsg", "用戶名或密碼錯誤");
            return "login";
        }
    }
二、service層

public interface userService {
Set<String> selectRoleName(String username);
Set<String> selectPermissionName(String userName);
Map<String,Object> selectUser(String username);
}

@Service
@Transactional
public class userServiceImpl implements userService {
@Resource
private userMapper um;

@Override
public Set<String> selectRoleName(String username) {
return um.selectRoleName(username);
}

@Override
public Set<String> selectPermissionName(String userName) {
return um.selectPermissionName(userName);
}

@Override
public Map<String,Object> selectUser(String username) {
return um.selectUser(username);
}
}

三、dao層
public interface userMapper {

        Set<String> selectRoleName(String username);
Set<String> selectPermissionName(String userName);
Map<String,Object> selectUser(String username);
}

四、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.grs.dao.userMapper">  
      
   <select id="login" parameterType="com.grs.domain.TUser" resultType="java.lang.Integer">
   select * from t_user 
   where 
   username = #{username} 
   and 
   password = #{password}
   </select>
   <!-- 查詢角色 -->
   <select id="selectRoleName" parameterType="com.grs.domain.TUsername" resultType="java.lang.String">
   select 
   r.roleName 
   from t_user as u,
   t_role as r,
   t_username as us
   where 
   us.us_id=u.us_id 
   and u.role_id=r.role_id 
   and (us.phonenumber=#{_parameter} or us.e_mail=#{_parameter})
   </select>
   
   <select id="selectPermissionName" parameterType="com.grs.domain.TUsername" resultType="java.lang.String">
    select p.permissionName 
    from t_user u,
    t_role r,
    t_permission p,
    t_username us
    where 
    us.us_id = u.us_id
    and u.role_id=r.role_id 
    and p.role_id=r.role_id 
    and (us.phonenumber=#{_parameter} or us.e_mail=#{_parameter})
   </select>
   
   <select id="selectUser" parameterType="java.lang.String" resultType="java.util.HashMap">
   select * from t_user as u,t_username as us 
   where 
   u.us_id = us.us_id 
   and (us.phonenumber = #{phonenumber} or us.e_mail = #{e_mail})
   </select>
</mapper>  

五、spring-mybatis-shiro.xml

........
<!-- shiro start -->
    <!-- 自定義realm -->
    <bean id="myRealm" class="com.grs.interceptor.myRealm">
    <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <property name="hashAlgorithmName" value="MD5"></property> <!-- 加密算法的名稱 -->
                <property name="hashIterations" value="1024"></property> <!-- 配置加密的次數 -->
            </bean>
        </property>
    </bean>
    <!-- 安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myRealm"/>
    </bean>
    <!-- shiro過濾器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- shiro的核心安全接口,屬性是必須的 -->
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/login.jsp"/>
        <property name="successUrl" value="/index.jsp" />
        <property name="unauthorizedUrl" value="/login.jsp"/>
        <!-- shiro連接約束配置,即過濾鏈的定義 -->
        <property name="filterChainDefinitions">
            <value>
            /login.jsp = anon
            /insertTUser.do = anon
            </value>
        </property>
    </bean>
    <!-- 保證實現了Shiro內部lifecycle函數的bean執行 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    <!-- 開啓shiro註解 -->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>
    
    <!-- shiro end -->
........

六、web.xml
 <!-- shiro過濾器 -->
  <filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <!-- 該值缺省爲false,表示生命週期由SpringApplicationContext管理,設置爲true則表示由ServletContainer管理 -->
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

七、bean 

public class TUser implements Serializable{


private static final long serialVersionUID = 1L;


private Integer id;
private Integer us_id;
private transient String password;
private int role_id;
private String salt;
....
//省略getter、setter方法
}

public class TUsername implements Serializable{


private static final long serialVersionUID = 1L;


private Integer us_id;
private String phonenumber;
private String e_mail;
.....
//省略getter、setter方法
}

<完>
ps:業務邏輯:
       用戶通過手機或郵箱進行註冊,註冊時會涉及到密碼加密(會在下章詳細講解),其中註冊成功之後,手機號碼或者郵箱作爲登錄時賬號,註冊過程中只需要用戶提供手機號碼或郵箱便可完成初步註冊,之後可在個人中心補全信息,信息補全時涉及到郵箱驗證,郵箱驗證成功之後,用戶可憑藉註冊時手機號碼與驗證成功的郵箱賬號進行登錄,所以我初步設計了兩張表進行業務邏輯處理。
       本節並沒有涉及到註冊模塊,只是運用shiro進行簡單的加密登錄驗證及處理。本人已標註備註信息,代碼較爲簡單,在此不過多闡述。
       最後,學海無涯,多練爲真。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章