扫描二维码下载沐宇APP

沐宇

微信扫码使用沐宇小程序

沐宇

Java涓璼hiro妗嗘灦鎬庝箞璋冪敤

扬州沐宇科技
2023-12-15 11:11:36
Java, Shiro

鍦↗ava涓娇鐢⊿hiro妗嗘灦锛屽彲浠ユ寜鐓т互涓嬫楠よ繘琛岃皟鐢細

  1. 娣诲姞Shiro渚濊禆锛氬湪椤圭洰鐨刾om.xml鏂囦欢涓坊鍔燬hiro鐩稿叧鐨勪緷璧栵紝渚嬪锛?/li>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.7.1</version>
</dependency>
  1. 閰嶇疆Shiro锛氬垱寤轰竴涓猄hiro閰嶇疆绫伙紝鐢ㄤ簬閰嶇疆Shiro鐨勭浉鍏冲弬鏁帮紝渚嬪锛?/li>
@Configuration
public class ShiroConfig {

    @Bean
    public Realm realm() {
        return new MyRealm();
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        filterFactoryBean.setSecurityManager(securityManager());
        filterFactoryBean.setLoginUrl("/login");
        filterFactoryBean.setUnauthorizedUrl("/unauthorized");

        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/**", "authc");

        filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return filterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm());
        return securityManager;
    }
}
  1. 鍒涘缓鑷畾涔夌殑Realm锛氬疄鐜癝hiro鐨凴ealm鎺ュ彛锛岀敤浜庡畾涔夌敤鎴风殑韬唤璁よ瘉鍜屾潈闄愭巿鏉冮€昏緫锛屼緥濡傦細
public class MyRealm implements Realm {

    @Override
    public String getName() {
        return "myRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        String password = new String((char[]) token.getCredentials());

        // 鏍规嵁鐢ㄦ埛鍚嶅拰瀵嗙爜杩涜韬唤璁よ瘉閫昏緫

        return new SimpleAuthenticationInfo(username, password, getName());
    }

    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();

        // 鏍规嵁鐢ㄦ埛鍚嶈繘琛屾潈闄愭巿鏉冮€昏緫

        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.addRole("admin");
        authorizationInfo.addStringPermission("user:read");

        return authorizationInfo;
    }
}
  1. 浣跨敤Shiro锛氬湪闇€瑕佷娇鐢⊿hiro杩涜韬唤璁よ瘉鍜屾潈闄愭巿鏉冪殑鍦版柟锛岄€氳繃SecurityUtils鑾峰彇Subject瀵硅薄锛岀劧鍚庤皟鐢ㄥ叾鐩稿簲鐨勬柟娉曪紝渚嬪锛?/li>
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);

if (subject.isAuthenticated()) {
    // 韬唤璁よ瘉鎴愬姛鐨勯€昏緫
} else {
    // 韬唤璁よ瘉澶辫触鐨勯€昏緫
}

if (subject.hasRole("admin")) {
    // 鎷ユ湁admin瑙掕壊鐨勯€昏緫
}

if (subject.isPermitted("user:read")) {
    // 鎷ユ湁user:read鏉冮檺鐨勯€昏緫
}

浠ヤ笂鏄娇鐢⊿hiro妗嗘灦鐨勫熀鏈皟鐢ㄦ柟娉曪紝鍏蜂綋鏍规嵁闇€姹傚彲浠ヨ繘琛屾洿璇︾粏鐨勯厤缃拰浣跨敤銆?/p>

扫码添加客服微信