SpringBoot與Shiro

Shiro框架簡介

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、受權、密碼學和會話管理。使用Shiro的易於理解的API,您能夠快速、輕鬆地得到任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。html

Apache Shiro 體系結構
image.png
一、Authentication 認證 ---- 用戶登陸
二、Authorization 受權 --- 用戶具備哪些權限
三、Cryptography 安全數據加密
四、Session Management 會話管理
五、Web Integration web系統集成
六、Interations 集成其它應用,spring、緩存框架java

進入主題

一、導入對應的依賴
若是須要鏈接數據庫的話,別忘記導入相應的座標。程序員

image.png

image.png
這裏先看一眼對應的目錄結構
image.png
二、編寫controller類
在controller類裏面咱們能夠測試thymeleafweb

@RequestMapping("/testThymeleaf")
    public String testThymeleaf(Model model){
        //把數據存入model
        model.addAttribute("name", "黑馬程序員");
        //返回test.html
        return "test";
    }

對應的主題部分:spring

/**
     * 登陸邏輯處理
     */
    @RequestMapping("/login")
    public String login(String name,String password,Model model){
        System.out.println("name="+name);
        /**
         * 使用Shiro編寫認證操做
         */
        //1.獲取Subject
        Subject subject = SecurityUtils.getSubject();
        
        //2.封裝用戶數據
        UsernamePasswordToken token = new UsernamePasswordToken(name,password);
        
        //3.執行登陸方法
        try {
            subject.login(token);
            
            //登陸成功
            //跳轉到test.html
            return "redirect:/testThymeleaf";
        } catch (UnknownAccountException e) {
            //e.printStackTrace();
            //登陸失敗:用戶名不存在
            model.addAttribute("msg", "用戶名不存在");
            return "login";
        }catch (IncorrectCredentialsException e) {
            //e.printStackTrace();
            //登陸失敗:密碼錯誤
            model.addAttribute("msg", "密碼錯誤");
            return "login";
        }
    }

三、Spring Boot與Shiro整合實現用戶認證
3.1分析Shiro的核心API
Subject: 用戶主體(把操做交給SecurityManager)
SecurityManager:安全管理器(關聯Realm)
Realm:Shiro鏈接數據的橋樑
3.2自定義Realm類數據庫

public class UserRealm extends AuthorizingRealm{

    /**
     * 執行受權邏輯
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
        System.out.println("執行受權邏輯");
        
        //給資源進行受權
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        
        //添加資源的受權字符串
        //info.addStringPermission("user:add");
        
        //到數據庫查詢當前登陸用戶的受權字符串
        //獲取當前登陸用戶
        Subject subject = SecurityUtils.getSubject();
        User user = (User)subject.getPrincipal();
        User dbUser = userSerivce.findById(user.getId());
        
        info.addStringPermission(dbUser.getPerms());
        
        return info;
    }
    
    @Autowired
    private UserService userSerivce;

    /**
     * 執行認證邏輯
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
        System.out.println("執行認證邏輯");
        
        //編寫shiro判斷邏輯,判斷用戶名和密碼
        //1.判斷用戶名
        UsernamePasswordToken token = (UsernamePasswordToken)arg0;
        
        User user = userSerivce.findByName(token.getUsername());
        
        if(user==null){
            //用戶名不存在
            return null;//shiro底層會拋出UnKnowAccountException
        }
        
        //2.判斷密碼
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
    }

3.3編寫Shiro配置類(*)緩存

@Configuration
public class ShiroConfig {

    /**
     * 建立ShiroFilterFactoryBean
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        
        //設置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        
        //添加Shiro內置過濾器
        /**
         * Shiro內置過濾器,能夠實現權限相關的攔截器
         *    經常使用的過濾器:
         *       anon: 無需認證(登陸)能夠訪問
         *       authc: 必須認證才能夠訪問
         *       user: 若是使用rememberMe的功能能夠直接訪問
         *       perms: 該資源必須獲得資源權限才能夠訪問
         *       role: 該資源必須獲得角色權限才能夠訪問
         */
        Map<String,String> filterMap = new LinkedHashMap<String,String>();
        /*filterMap.put("/add", "authc");
        filterMap.put("/update", "authc");*/
        
        filterMap.put("/testThymeleaf", "anon");
        //放行login.html頁面
        filterMap.put("/login", "anon");
        
        //受權過濾器
        //注意:當前受權攔截後,shiro會自動跳轉到未受權頁面
        filterMap.put("/add", "perms[user:add]");
        filterMap.put("/update", "perms[user:update]");
        
        filterMap.put("/*", "authc");
        
        //修改調整的登陸頁面
        shiroFilterFactoryBean.setLoginUrl("/toLogin");
        //設置未受權提示頁面
        shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");
        
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        
        
        return shiroFilterFactoryBean;
    }
    
    /**
     * 建立DefaultWebSecurityManager
     */
    @Bean(name="securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //關聯realm
        securityManager.setRealm(userRealm);
        return securityManager;
    }
    
    /**
     * 建立Realm
     */
    @Bean(name="userRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }
    
    /**
     * 配置ShiroDialect,用於thymeleaf和shiro標籤配合使用
     */
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }

3.4使用Shiro內置過濾器實現頁面攔截
代碼見上塊。。。
3.5實現用戶認證(登陸)操做安全

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>登陸頁面</title>
</head>
<body>
<h3>登陸</h3>
<h3 th:text="${msg}" style="color: red"></h3>

<form method="post" action="login">
    用戶名:<input type="text" name="name"/><br/>
    密碼:<input type="password" name="password"/><br/>
    <input type="submit" value="登陸"/>
</form>
</body>
</html>

至於service層和mapper層,這裏不在贅述!
須要源碼的能夠在個人csdn裏面進行留言!!!網絡

相關文章
相關標籤/搜索