찾다
Javajava지도 시간springboot에서 Shiro를 빠르게 구현하는 방법

    1. 시로를 사용할 때 꼭 알아야 할 것

    1. 시로란?

    • 1. Apache Shiro는 Java 보안(권한) 프레임워크입니다

    • 2. JavaEE 또는 JavaSE에서 사용할 수 있는 충분한 애플리케이션을 쉽게 개발할 수 있습니다. 3. Shiro는 인증, 승인, 암호화, 세션 관리, 웹 통합, 캐싱 등

    • 2. Shiro 아키텍처에는 일반적으로 사용되는 세 가지 핵심 개체가 있습니다.

    제목: 사용자

    • SecurityManager: 모든 사용자 관리

    • Readim: 연결 데이터

    • 3. springboot에서 사용하는 경우 주로 두 가지 모듈(요청 필터링 모듈, 인증 및 권한 부여 모듈)로 간주할 수 있습니다.

    • 1 인증 및 권한 부여 모듈: 인증 및 권한 부여 모듈에는 주로 두 가지 측면이 포함됩니다. 인증 및 승인. 인증은 사용자의 로그인 상태를 확인하는 것을 의미하며, 인증은 현재 사용자가 소유한 역할과 권한을 획득하여 이를 AuthoriztionInfo에 전달하여 관련 정보를 Shiro
    에 전달할 수 있도록 하는 것을 의미합니다. 2. 요청 필터링 모듈: 현재에 따라 사용자가 소유한 권한, 역할 및 기타 정보를 사용하여 요청된 권한이 있는지(즉, 현재 액세스 중인 주소를 요청할 수 있는지 여부)를 확인합니다. 3. 이상 shiro 프레임워크를 사용한 권한 인증 차단의 가장 기본적인 구현입니다. 또한 비밀번호 암호화, 로그인 번호 제한(redis) 등의 기능을 다시 작성하여 에 따라 학습할 수도 있습니다. 실제 비즈니스 상황

    4. 종속성

    <!--        后台拦截-->
            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>1.4.0</version>
            </dependency>

    2, 특정 용도

    1. 구성 클래스 작성(config)

    1.1, Shiro 필터 개체(ShiroFilterFactoryBean)

    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier(SecurityManager) DefaultWebSecurityManager securityManager){
       	ShiroFilterFactiryBean bean = new ShiroFilterFactoryBean()
    	//关联SecurityManager设置安全管理器	
     	bean.setSecurityManager(securityManager)
        
    	//添加内置过滤器
            /*
            	anon:无需过滤就可以访问
                authc:必须认证了才可访问(登录后才可访问)
                user:必须拥有"记住我"功能才可访问
                perms:拥有对某个资源的权限才可以访问
                role:拥有某个角色权限才可访问
            */
      	Map<String,String> filterMap = new LinkedHashMap<>();
        //拦截 
        //filterMap.put("页面地址","内置过滤器")
    	//filterMap.put("/user/name","anon")
    	//filterMap.put("/user/book","authc")
        
    	//具有user:add权限时才可以访问/user/name
        //perms中的“user:add”与数据库中对应权限要一致
        filterMap.put("/user/name","perms[user:add]")
        
    	//授权,正常情况下,没有授权会跳转到未授权页面
     	bean.setUnauthorizedUrl("未授权时跳转的页面")  
            
      	//创建一个过滤器链(其中内容通过Map存储)
     	bean.setFilterChainDefinitionMap(FilterMap); 
        //设置登录请求(登录的地址添加,当使用"authc"时,如果未登录,则跳转到登录页面)
        bean.setLoginUrl("/login")
    	return bean;
    }

    1.2, Shiro 보안 개체(DefaultWebSecurity)

    //@Qualifier:引入bena对象
    @Bean(name="SecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("MyRealm") MyRealm myRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurotyManager();
        //关联MyRealm
        securityManager.setRealm(myRealm);
        return securityManager;
    }

    1.3, 영역 객체 생성(사용자 정의)
    //将自定义的realm对象交给spring
    //@Bean(name="MyRealm")中name属性不加默认名称为方法名
    @Bean(name="MyRealm")
    public MyRealm MyRealm(){
     	return new MyRealm();
    }
    2, 영역 객체 생성
    2.1 AuthorizingRealm 클래스를 상속하도록 영역 클래스를 사용자 정의
    class MyRealm extends AuthorizingRealm
    2.2 인증:

    project AthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){
        //1、权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission)
     	SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //2、拿到当前登录的对象信息,通过认证方法SimpleAuthenticationInfo(第一个参数)已经进行存入 
        User user =(user)SecurityUtils.getSubject().getPrincipal();
        //3、将该对象的角色信息进行存入
        // 赋予角色
    	List<Role> roleList = roleService.listRolesByUserId(userId);
    	for (Role role : roleList) {
    		info.addRole(role.getName());
    	}
        //4、设置该用户的权限
        infO.addStringPermission(user.getPerms())
        //5、将该对象的权限信息进行存入(permissionSet一个权限信息的集合)
        info.setStringPermissions(permissionSet);
        return info;
    }

    인증:
    project AuthenticationInfo doGetAuthorizationInfo(AuthenticationToken token){
        //1、拿到用户登陆的信息
        UsernamePasswordToken userToken =(UsernamePasswordToken) token;
        //2、通过用户名(userToken.getUsername)获取数据库中的对象user
        //如果获取对象user为空则该用户不从在,返回return null(抛出用户不存在异常)
        if (user == null) {
                throw new UnknownAccountException("账号不存在!");
            	//或直接 return null;
            }
        //3、密码认证,有shiro完成(AuthenticationInfo是一个接口,SimpleAuthenticationInfo是其接口的实现类)
        //也可对密码进行加密 如MD5 MD5盐值
        return new SimpleAuthenticationInfo("用户对象信息(user)","通过用户从数据库中获得的用户密码(user.password)","")
    }
    3. 로그인한 사용자 정보 전달(컨트롤러를 통해 로그인 요청 정보 가져오기)
    //获取当前用户
    Subject subject = SecurityUtils.getSubject();
    //封装用户的登录数据(username:用户登陆时传入的账号;password:用户登陆时传入的密码)
    UsernamePasswordToken token = new UsernamePasswordToken(username,password);
    //执行登录(如果有异常则登录失败,没有异常则登录成功,在Shiro中已经为我们封装了登录相关的异常,直接使用即可)
    try{
        subject.login(token);//执行登录成功后
        return "首页"
    }catch(UnknowAccountException e){//用户名不存在
        return "login"
    }catch(IncorrectCredentialsException e){//密码不存在
        return "login"
    }
    注意:该方法中登录失败后返回的是跳转的页面,故不可用@ResponseBody
    3. 특정 구현

    1. 컨트롤러 구현

    package com.lingmeng.shiro;
     
    import com.lingmeng.pojo.entity.Admin;
    import com.lingmeng.pojo.entity.Permission;
    import com.lingmeng.pojo.entity.Role;
    import com.lingmeng.pojo.resp.BaseResp;
    import com.lingmeng.service.AdminService;
    import com.lingmeng.service.RoleService;
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.*;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import org.apache.shiro.subject.Subject;
    import org.springframework.beans.factory.annotation.Autowired;
     
    import java.util.HashSet;
    import java.util.Set;
     
    public class MyRealm extends AuthorizingRealm {
     
        @Autowired
        RoleService roleService;
     
        @Autowired
        AdminService adminService;
     
        //授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //获取用户信息
            Subject subject = SecurityUtils.getSubject();
            Admin admin =(Admin) subject.getPrincipal();
            //获取用户的权限及角色信息
            BaseResp baseResp = roleService.selectOne(admin.getUsername());
            Role role = (Role) baseResp.getData();
            //将获取的角色及权限进行存入
            if (role!=null){
                //角色存入
                info.addRole(role.getName());
                //权限信息进行存入
                Set<String> perms = new HashSet<>();
                for (Permission perm : role.getPerms()) {
                    perms.add(perm.getUrl());
                }
                info.setStringPermissions(perms);
            }
            return info;
        }
     
        //认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            //获取登录信息(登录的账号)
            String username =(String)authenticationToken.getPrincipal();
    //      UsernamePasswordToken userToken =(UsernamePasswordToken) authenticationToken;拿到登录时传入的账号和密码对象
            //从数据库中查询该对象的信息
            Admin admin = adminService.selectOne(username);
            if (admin==null){
                throw new UnknownAccountException("账号不存在");
            }
            return new SimpleAuthenticationInfo(admin,admin.getPassword(),this.getName());
        }
    }

    3.

    위 내용은 springboot에서 shiro의 몇 가지 기본 사용법입니다. 모든 사람이 배우는 데 도움이 될 것입니다(코드의 엔터티, 역할 및 권한은 자신의 데이터베이스 쿼리 결과에 따라 대체될 수 있음).

    위 내용은 springboot에서 Shiro를 빠르게 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?Mar 17, 2025 pm 05:46 PM

    이 기사에서는 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 및 Gradle을 사용하여 접근 방식과 최적화 전략을 비교합니다.

    적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?적절한 버전 및 종속성 관리로 Custom Java 라이브러리 (JAR Files)를 작성하고 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:45 PM

    이 기사에서는 Maven 및 Gradle과 같은 도구를 사용하여 적절한 버전 및 종속성 관리로 사용자 정의 Java 라이브러리 (JAR Files)를 작성하고 사용하는 것에 대해 설명합니다.

    카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?카페인 또는 구아바 캐시와 같은 라이브러리를 사용하여 자바 애플리케이션에서 다단계 캐싱을 구현하려면 어떻게해야합니까?Mar 17, 2025 pm 05:44 PM

    이 기사는 카페인 및 구아바 캐시를 사용하여 자바에서 다단계 캐싱을 구현하여 응용 프로그램 성능을 향상시키는 것에 대해 설명합니다. 구성 및 퇴거 정책 관리 Best Pra와 함께 설정, 통합 및 성능 이점을 다룹니다.

    캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?Mar 17, 2025 pm 05:43 PM

    이 기사는 캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA를 사용하는 것에 대해 설명합니다. 잠재적 인 함정을 강조하면서 성능을 최적화하기위한 설정, 엔티티 매핑 및 모범 사례를 다룹니다. [159 문자]

    Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?Mar 17, 2025 pm 05:35 PM

    Java의 클래스 로딩에는 부트 스트랩, 확장 및 응용 프로그램 클래스 로더가있는 계층 적 시스템을 사용하여 클래스로드, 링크 및 초기화 클래스가 포함됩니다. 학부모 위임 모델은 핵심 클래스가 먼저로드되어 사용자 정의 클래스 LOA에 영향을 미치도록합니다.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 채팅 명령 및 사용 방법
    1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 최신 버전

    Atom Editor Mac 버전 다운로드

    Atom Editor Mac 버전 다운로드

    가장 인기 있는 오픈 소스 편집기

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    VSCode Windows 64비트 다운로드

    VSCode Windows 64비트 다운로드

    Microsoft에서 출시한 강력한 무료 IDE 편집기