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

shrio中hashedCredentialsMatcher密碼匹配示例詳解

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

類圖如下:

在這里插入圖片描述

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

處理過程

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

示例代碼

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

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ù)登錄名獲取實(shí)體對(duì)象和增加用戶兩個(gè)方法,略過。service代碼如下,保存代碼時(shí),密碼使用sha256加密,鹽隨機(jī)獲取20位隨機(jī)數(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);// 會(huì)觸發(fā)com.shiro.config.MyShiroRealm的doGetAuthenticationInfo方法
                result = "登錄成功";
            } catch (UnknownAccountException e) {
                result = "用戶名錯(cuò)誤";
            } catch (IncorrectCredentialsException e) {
                e.printStackTrace();
                result = "密碼錯(cuò)誤";
            }
        }
        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();
        //設(shè)置自定義的securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //設(shè)置默認(rèn)登錄的url,身份認(rèn)證失敗會(huì)訪問該URL
        shiroFilterFactoryBean.setLoginUrl("/login");
        //設(shè)置成功,會(huì)訪問該url
        shiroFilterFactoryBean.setSuccessUrl("/success");
        //設(shè)置未授權(quán)界面,權(quán)限認(rèn)證失敗會(huì)訪問該url
        shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
        //進(jìn)行攔截器配置
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        // <!-- authc:所有url都必須認(rèn)證通過才可以訪問; 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");
        //主要這行代碼必須放在所有權(quán)限設(shè)置的最后,不然會(huì)導(dǎo)致所有 url 都被攔截 剩余的都需要認(rèn)證
        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) {
       //授權(quán)部分代碼略
        return null;
    }

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

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

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

        return authenticationInfo;
    }

測(cè)試,使用張三登錄

在這里插入圖片描述

在這里插入圖片描述

以上就是shrio中hashedCredentialsMatcher密碼匹配示例詳解的詳細(xì)內(nèi)容,更多關(guān)于shrio中hashedCredentialsMatcher密碼匹配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

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

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

    java條件語句示例詳解

    本文給大家介紹java條件語句,Java 中的條件語句允許程序根據(jù)條件的不同執(zhí)行不同的代碼塊,一個(gè) if 語句包含一個(gè)布爾表達(dá)式和一條或多條語句,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    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框架中的一個(gè)核心類,用于簡化Java應(yīng)用程序與關(guān)系型數(shù)據(jù)庫的交互操作,本文給大家介紹SpringBoot中使用JdbcTemplate訪問Oracle數(shù)據(jù)庫的方法,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • mybatis的映射xml中動(dòng)態(tài)設(shè)置orderby方式

    mybatis的映射xml中動(dòng)態(tài)設(shè)置orderby方式

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

    java中的forkjoin框架的使用

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

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

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

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

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

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

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

最新評(píng)論

福海县| 西青区| 来宾市| 克东县| 招远市| 台北市| 丰镇市| 大理市| 醴陵市| 柘荣县| 子洲县| 昌乐县| 龙山县| 河西区| 京山县| 东城区| 阆中市| 本溪市| 大埔县| 宣化县| 吴川市| 桑日县| 固镇县| 青州市| 湖州市| 井研县| 日土县| 晋江市| 玉山县| 荆门市| 建德市| 上饶县| 井冈山市| 鹤峰县| 广宗县| 广饶县| 西丰县| 安塞县| 洛南县| 庐江县| 乌兰察布市|