最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

shrio中hashedCredentialsMatcher密碼匹配示例詳解

 更新時間:2021年10月13日 09:41:38   作者:guoyp2126  
shrio是一個輕量級權限管理框架,密碼的匹配由框架內部完成。密碼是否匹配由接口CredentialsMatcher定義實現(xiàn)類完成,CredentialsMatcher實現(xiàn)類有SimpleCredentialsMatcher和HashedCredentialsMatcher兩個

類圖如下:

在這里插入圖片描述

SimpleCredentialsMatcher是明文匹配,也是shrio框架默認的比對方式,網(wǎng)上的例子多是此方式。實際項目中,數(shù)據(jù)庫中的密碼一般是密文,此時密碼的匹配需使用HashedCredentialsMatcher完成。

處理過程

在controller中通過Subject的login(token)將接收過來用戶賬號和密碼(明文)交給shrio框架,示例代碼如下

在這里插入圖片描述

其次通過HashedCredentialsMatcher告訴shrio使用加密方式;

在這里插入圖片描述

最后通過AuthorizingRealm,將數(shù)據(jù)庫中獲取的密碼,告訴shrio框架,shrio處理完成后返回處理結果。

在這里插入圖片描述

示例代碼

數(shù)據(jù)庫創(chuàng)建表user,結構如下:

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `psw` varchar(200) DEFAULT NULL,
  `user_right` varchar(300) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  `salt` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) 

在dao完成根據(jù)登錄名獲取實體對象和增加用戶兩個方法,略過。service代碼如下,保存代碼時,密碼使用sha256加密,鹽隨機獲取20位隨機數(shù)

@Service("UserService")
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {

    @Override
    public UserEntity getUserByname(String loginName) {
        return baseMapper.queryByUserName(loginName);
    }

    @Override
    public boolean save(UserEntity user) {
        user.setCreateTime(new Date());
        String salt = RandomStringUtils.randomAlphanumeric(20);
        user.setPsw(new Sha256Hash(user.getPsw(), salt).toHex());//sha256加密
        user.setSalt(salt);
        try {
            baseMapper.insert(user);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

controller代碼如下

@RestController
public class UserController {
    @Autowired
    private UserService userService;
    
    @PostMapping("/login")
    public Map<String, Object> login(@RequestParam Map<String, Object> params) {
        String username=params.get("username").toString();
        String password=params.get("password").toString();
        String result = "已登錄";
        Subject currentUser = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        if (!currentUser.isAuthenticated()) {
            try {
                currentUser.login(token);// 會觸發(fā)com.shiro.config.MyShiroRealm的doGetAuthenticationInfo方法
                result = "登錄成功";
            } catch (UnknownAccountException e) {
                result = "用戶名錯誤";
            } catch (IncorrectCredentialsException e) {
                e.printStackTrace();
                result = "密碼錯誤";
            }
        }
        return R.ok(result);
    }

    @GetMapping("/logout")
    public void logout() {
        Subject currentUser = SecurityUtils.getSubject();
        UserEntity user = (UserEntity)currentUser.getPrincipal();
        System.out.println(user.getName());
        currentUser.logout();
    }

    @RequestMapping("/user/add")
    public String add(@RequestBody UserEntity user) {
        userService.save(user);
        System.out.println("新增用戶");
        return "hello";
    }
}

使用ShiroConfig 代替xml配置文件方式

@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //設置自定義的securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //設置默認登錄的url,身份認證失敗會訪問該URL
        shiroFilterFactoryBean.setLoginUrl("/login");
        //設置成功,會訪問該url
        shiroFilterFactoryBean.setSuccessUrl("/success");
        //設置未授權界面,權限認證失敗會訪問該url
        shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
        //進行攔截器配置
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // <!-- authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問-->
        filterChainDefinitionMap.put("/webjars/**", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/", "anon");
        filterChainDefinitionMap.put("/front/**", "anon");
        filterChainDefinitionMap.put("/user/add", "perms[add]");
        filterChainDefinitionMap.put("/admin/**", "authc");
        filterChainDefinitionMap.put("/user/**", "authc");
        //主要這行代碼必須放在所有權限設置的最后,不然會導致所有 url 都被攔截 剩余的都需要認證
        filterChainDefinitionMap.put("/**", "authc");
        //配置logout過濾器
        filterChainDefinitionMap.put("/logout","logout");       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }
    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager();
        defaultSecurityManager.setRealm(customRealm());
        return defaultSecurityManager;
    }

    @Bean
    public CustomRealm customRealm() {
        CustomRealm customRealm = new CustomRealm();
        //SimpleCredentialsMatcher明文匹配,hashedCredentialsMatcher加鹽匹配
        customRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return customRealm;
    }

    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher() {
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        hashedCredentialsMatcher.setHashAlgorithmName("SHA-256");
        hashedCredentialsMatcher.setHashIterations(1);
        return hashedCredentialsMatcher;
    }

}

Realm中代碼如下:

public class CustomRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
       //授權部分代碼略
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String loginName = (String) authenticationToken.getPrincipal();

        UserEntity user= userService.getUserByname(loginName);
        if (user == null) {  // 沒找到帳號 
            throw new UnknownAccountException();
        }

        // 交給AuthenticatingRealm使用CredentialsMatcher進行密碼匹配
        SimpleAuthenticationInfo authenticationInfo =
                new SimpleAuthenticationInfo(user, user.getPsw(), ByteSource.Util.bytes(user.getSalt()),getName());

        return authenticationInfo;
    }

測試,使用張三登錄

在這里插入圖片描述

在這里插入圖片描述

以上就是shrio中hashedCredentialsMatcher密碼匹配示例詳解的詳細內容,更多關于shrio中hashedCredentialsMatcher密碼匹配的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解Java中如何使用日志庫在代碼中添加日志

    詳解Java中如何使用日志庫在代碼中添加日志

    這篇文章主要為大家介紹了Java中如何使用日志庫在代碼中添加日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 如何在不使用spring框架中使用aop的功能

    如何在不使用spring框架中使用aop的功能

    這篇文章主要介紹了如何在不使用spring框架中使用aop的功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java條件語句示例詳解

    java條件語句示例詳解

    本文給大家介紹java條件語句,Java 中的條件語句允許程序根據(jù)條件的不同執(zhí)行不同的代碼塊,一個 if 語句包含一個布爾表達式和一條或多條語句,本文結合示例代碼給大家講解的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Java List接口與Iterator接口及foreach循環(huán)使用解析

    Java List接口與Iterator接口及foreach循環(huán)使用解析

    這篇文章主要介紹了Java List接口與Iterator接口及foreach循環(huán),主要包括List接口與Iterator接口及foreach循環(huán)具體的使用方法和代碼,需要的朋友可以參考下
    2022-04-04
  • SpringBoot中使用JdbcTemplate訪問Oracle數(shù)據(jù)庫的案例詳解

    SpringBoot中使用JdbcTemplate訪問Oracle數(shù)據(jù)庫的案例詳解

    JdbcTemplate是Spring框架中的一個核心類,用于簡化Java應用程序與關系型數(shù)據(jù)庫的交互操作,本文給大家介紹SpringBoot中使用JdbcTemplate訪問Oracle數(shù)據(jù)庫的方法,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • mybatis的映射xml中動態(tài)設置orderby方式

    mybatis的映射xml中動態(tài)設置orderby方式

    這篇文章主要介紹了mybatis的映射xml中動態(tài)設置orderby方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java中的forkjoin框架的使用

    java中的forkjoin框架的使用

    這篇文章主要介紹了java中的fork join框架的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • SpringCloud應用骨架開發(fā)詳解

    SpringCloud應用骨架開發(fā)詳解

    這篇文章主要介紹了SpringCloud應用骨架開發(fā)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • spring cloud gateway 全局過濾器的實現(xiàn)

    spring cloud gateway 全局過濾器的實現(xiàn)

    全局過濾器作用于所有的路由,不需要單獨配置,我們可以用它來實現(xiàn)很多統(tǒng)一化處理的業(yè)務需求,這篇文章主要介紹了spring cloud gateway 全局過濾器的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • java數(shù)字轉漢字工具類詳解

    java數(shù)字轉漢字工具類詳解

    這篇文章主要為大家詳細介紹了java數(shù)字轉漢字工具類的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評論

浦东新区| 天柱县| 绥宁县| 绥江县| 休宁县| 岗巴县| 隆尧县| 忻城县| 区。| 东宁县| 黎平县| 天峻县| 砚山县| 尚志市| 濮阳市| 辰溪县| 永胜县| 土默特左旗| 县级市| 牡丹江市| 通渭县| 潍坊市| 奉新县| 怀化市| 东乡县| 仙居县| 上杭县| 陇西县| 彭州市| 兰溪市| 哈尔滨市| 海城市| 交城县| 教育| 噶尔县| 北流市| 南安市| 台中市| 蒲江县| 平遥县| 海南省|