Shiro(二)通過shiro實現登錄 連接數據庫+集成Springboot


第一步:重寫Realm

import com.baizhi.entity.User; import org.apache.shiro.authc.*; import org.apache.shiro.realm.AuthenticatingRealm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by mhm on 2019/6/27. */
public class MyRealm extends AuthenticatingRealm { private Logger logger = LoggerFactory.getLogger(MyRealm.class); @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; //獲取到用戶輸入的用戶名
        String username = upToken.getUsername(); //去數據庫中查詢,模擬
        logger.info("開始從數據庫中查詢"); User user = new User(); user.setName("xiaobai"); user.setPassword("1"); // 把查詢到的數據封裝成AuthenticationInfo對象
        /** * 參數1:principal 身份信息 賬號 * 參數2:憑證信息 密碼 * 參數3:realm的名字 */ SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(user.getName(),user.getPassword(),this.getName()); logger.info("查詢結束,返回結果"); return simpleAuthenticationInfo; } }

 


 

上面這個圖,就是說為啥需要重寫Realm,

第二步:配置

import com.baizhi.util.MyRealm; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.mgt.WebSecurityManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; /** * Created by mhm on 2019/6/27. */
//聲明,為配置類
@Configuration public class ShiroConfig { private Logger logger = LoggerFactory.getLogger(ShiroConfig.class); /** * 創建自定義的Realm */ @Bean public MyRealm getMyRealm(){ return new MyRealm(); } /** *創建安全管理器 */ @Bean//Bean注解修飾的方法的形參,在Spring創建時,從工廠中賦值
    public WebSecurityManager getWebSecurityManager(MyRealm myRealm){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //設置自定義Realm
 securityManager.setRealm(myRealm); return securityManager; } /** * 創建過濾器 */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(WebSecurityManager securityManager){ logger.info("創建Shiro過濾器"); ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); /** * 設置過濾規則 */ logger.info("設置過濾規則"); Map map = new HashMap(); /** * anon 代表匿名可訪問 就是不用登錄就可以訪問 不過濾 * * authc 代表登錄后才能訪問 需要認證 會被過濾 * * 支持通配符* * * 注意攔截規則 一個一個配置 */ map.put("/login.jsp","anon"); map.put("/shiro/*","anon"); map.put("/main/*", "authc"); map.put("/guru/*", "authc"); map.put("/menu/*", "authc"); filterFactoryBean.setFilterChainDefinitionMap(map); /** * 配置沒有登錄,被攔截后的請求路徑 */ filterFactoryBean.setLoginUrl("userLogin.jsp"); //設置安全管理器
        logger.info("設置安全管理器"); filterFactoryBean.setSecurityManager(securityManager); return filterFactoryBean; } }

 

 3.在Controller中使用

@RequestMapping("login") public @ResponseBody void login(String username,String password){ logger.info("開始登錄"); //1.把數據封裝成Token
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password); //2.獲取Subject
        Subject subject = SecurityUtils.getSubject(); //3.登錄
        try {  subject.login(usernamePasswordToken); logger.info("登錄成功"); } catch (AuthenticationException e) { // e.printStackTrace();
            logger.info("登錄失敗"); } }

我這里就做一個模擬,不實際跳轉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM