자바 백 엔 드 피 갱-Spring Boot 통합 Shiro

4028 단어 자바
Shiro 는 비교적 자주 사용 하 는 안전 인증 프레임 워 크 로 간단 하면 서도 실 용적 입 니 다.Spring Boot 에서 Shiro 를 통합 하 는 방법 은 두 가지 가 있 습 니 다.
전통 적 인 SSM+Shiro 의 설정 을 자바 로 구현 합 니 다4.567917.Shiro 가 공식 적 으로 제공 하 는 자동화 설정 을 사용 하여 본 고 에서 실 용적 인 두 번 째 방식 으로 통합 시 켰 으 나 Postman 을 사용 하여 테스트 할 때 다음 과 같은 오류 가 발생 했다
org.apache.shiro.UnavailableSecurityManagerException: 
No SecurityManager accessible to the calling code,
either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  
This is an invalid application configuration.

4.567917.Postman 오 류 는 다음 과 같이 인터넷 에서 각종 튜 토리 얼 을 찾 아 해결 방법 을 찾 았 습 니 다.대부분 필터 의 문제 라 고 합 니 다.웹.xml 에 Delegating FilterProxy 를 추가 해 야 합 니 다.그러나 본 논문 의 통합 은 Spring Boot 환경 에서 테스트 한 것 으로 웹.xml 파일 을 사용 하지 않 았 습 니 다.웹.xml 파일 을 더 하면 전체 공정 이 이도 저도 아 닙 니 다.그래서 이런 해법 을 과 감히 버 렸 다.그럼 어떻게 해결 해 야 되 지?나중에 동료 에 게 가르침 을 청 한 후에 야 Shiro 가 공식 적 으로 제공 하 는 자동화 설정 을 사용 하려 면 다음 과 같은 의존 도 를 사용 해 야 한 다 는 것 을 알 게 되 었 다

    org.apache.shiro
    shiro-spring-boot-web-starter
    1.4.0


자바 로 SSM+Shiro 설정 에 의존 하 는 것 이 아 닙 니 다.

    org.apache.shiro
    shiro-web
    1.4.0


    org.apache.shiro
    shiro-spring
    1.4.0


정확 한 코드 예 시 는 다음 과 같다.
  • 의존 도 를 추가 합 니 다
  • 
        org.springframework.boot
        spring-boot-starter-web
    
    
        org.apache.shiro
        shiro-spring-boot-web-starter
        1.4.0
    
    

    사용자 정의 MyRealm
    public class MyRealm extends AuthorizingRealm {
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            return null;
        }
    
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            String username = ((UsernamePasswordToken) token).getUsername();
            if (!"zhangsan".equals(username)) {
                throw new UnknownAccountException("     ");
            }
            return new SimpleAuthenticationInfo(username, "123", getName());
        }
    }
    

    ShiroConfig 를 만 듭 니 다
    @Configuration
    public class ShiroConfig {
        @Bean
        MyRealm myRealm() {
            return new MyRealm();
        }
        @Bean
        DefaultWebSecurityManager securityManager() {
            DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
            manager.setRealm(myRealm());
            return manager;
        }
        @Bean
        ShiroFilterChainDefinition shiroFilterChainDefinition() {
            DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
            definition.addPathDefinition("/doLogin", "anon");
            definition.addPathDefinition("/**", "authc");
            return definition;
        }
    }
    
  • 컨트롤 러 를 만들어 테스트 합 니 다
  • @Controller
    public class ShiroController {
    
        @PostMapping("/doLogin")
        public String doLogin(String username, String password) {
            try {
                Subject subject = SecurityUtils.getSubject();
                subject.login(new UsernamePasswordToken(username, password));
                return "redirect:/index";//        
            } catch (AuthenticationException e) {
                e.printStackTrace();
            }
            return "redirect:/login";//        
        }
    
        @GetMapping("/index")
        @ResponseBody
        public String index() {
            return "index";
        }
    
        @GetMapping("/login")
        @ResponseBody
        public String login() {
            return "login";
        }
    }
    

    테스트 결 과 는 다음 과 같다.
    티끌 모 아 태산,물방울 이 돌 을 뚫 는 다!

    좋은 웹페이지 즐겨찾기