springmvc + shiro + maven 로그 인 및 권한 부여

15121 단어 자바 기술 총화
Shiro Shiro 는 인증 과 권한 수 여 를 간소화 하기 위 한 아파 치 의 다음 오픈 소스 프로젝트 입 니 다.
 1: shiro 설정, maven 을 통 해 shiro 관련 jar 패키지 가입
  
      
        org.apache.shiro  
        shiro-core  
        1.2.1  
      
      
        org.apache.shiro  
        shiro-web  
        1.2.1  
      
      
        org.apache.shiro  
        shiro-ehcache  
        1.2.1  
      
      
        org.apache.shiro  
        shiro-spring  
        1.2.1  
      

2: 웹. xml 에 shiro 필 터 를 추가 합 니 다.
  
     
        shiroFilter  
        org.springframework.web.filter.DelegatingFilterProxy  
      
      
        shiroFilter  
        /admin/*  
      

3: springmvc 에서 shiro 설정
  
<!-- web.xml shiro filter   bean -->  
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
    <!--    ,     -->  
    <property name="securityManager" ref="securityManager" />  
    <!--    ,      ,         -->  
    <property name="loginUrl" value="/admin/login.do" />  
    <!--          /admin/index.do,     ,shiro               -->  
    <property name="successUrl" value="/admin/index.do" />  
    <!--   unauthorizedUrl              -->  
    <property name="unauthorizedUrl" value="/refuse.jsp" />  
    <!--    filter,               -->  
    <property name="filters">  
        <map>  
            <!--       FormAuthenticationFilter  shiroFilter  -->  
            <entry key="authc" value-ref="formAuthenticationFilter" />  
        </map>  
    </property>  
    <property name="filterChainDefinitions">  
        <value>  
            <!--             -->  
            /images/** = anon  
            /js/** = anon  
            /styles/** = anon  
            <!--    ,      -->  
            /validatecode.jsp = anon  
            <!--    logout.do  ,shiro   session -->  
            /admin/logout.do = logout  
            <!--             ,  url    ,         -->  
            <!-- /items/queryItems.action = perms[item:query] /items/editItems.action   
                = perms[item:edit] -->  
            <!--                   -->  
            /welcome.jsp = user  
            /admin/index.do = user  
            <!-- /** = authc   url             -->  
            /** = authc  
        </value>  
    </property>  
</bean>  

<!-- securityManager      -->  
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
    <property name="realm" ref="customRealm" />  
    <!--         -->  
    <property name="cacheManager" ref="cacheManager" />  
    <!--   session    -->  
    <!-- <property name="sessionManager" ref="sessionManager" /> -->  
    <!--     -->  
    <property name="rememberMeManager" ref="rememberMeManager" />  
</bean>  

<!--    realm -->  
<bean id="customRealm" class="com.zhijianj.stucheck.shiro.CustomRealm">  
    <!--          realm ,realm               -->  
    <!-- <property name="credentialsMatcher" ref="credentialsMatcher" /> -->  
</bean>  

<!--       -->  
<bean id="credentialsMatcher"  
    class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">  
    <!--   MD5     -->  
    <property name="hashAlgorithmName" value="md5" />  
    <!--        -->  
    <property name="hashIterations" value="1" />  
</bean>  

<!--    form      -->  
<!--   Form          ,            ,        、   loginurl      ,     -->  
<!--       ,      -->  
<bean id="formAuthenticationFilter"  
    class="com.zhijianj.stucheck.shiro.CustomFormAuthenticationFilter ">  
    <!--       input  ,   username -->  
    <property name="usernameParam" value="username" />  
    <!--       input  ,   password -->  
    <property name="passwordParam" value="password" />  
    <!--    input   ,   rememberMe -->  
    <property name="rememberMeParam" value="rememberMe" />  
</bean>  
<!--       -->  
<bean id="sessionManager"  
    class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  
    <!-- session     ,     -->  
    <property name="globalSessionTimeout" value="600000" />  
    <!--      session -->  
    <property name="deleteInvalidSessions" value="true" />  
</bean>  
<!--       -->  
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
    <property name="cacheManagerConfigFile" value="classpath:shiro-ehcache.xml" />  
</bean>  
<!-- rememberMeManager   , cookie,  cookie       -->  
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">  
    <property name="cookie" ref="rememberMeCookie" />  
</bean>  
<!--    cookie -->  
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
    <!-- rememberMe cookie    -->  
    <constructor-arg value="rememberMe" ;  
    <!--    cookie    30  -->  
    <property name="maxAge" value="2592000";  
</bean>  
4: 사용자 정의 Realm 인 코딩
  public class CustomRealm extends AuthorizingRealm {  
    //   realm     
    @Override  
    public void setName(String name) {  
        super.setName("customRealm");  
    }  
    @Autowired  
    private AdminUserService adminUserService;  
/** 
 *    
 */  
@Override  
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  

    // token                
    //     token        
    String userName = (String) token.getPrincipal();  
    //    :       userCode        
    TAdminUser adminUser = adminUserService.getAdminUserByUserName(userName);  
    //         null  
    if (adminUser == null) {//  
        return null;  
    }  
    //            
    String password = adminUser.getPassword();  
    /** 
     *      ,      
     */  
    AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(adminUser, password, this.getName());  
           //MD5   +  +      

    return authcInfo;  
}  

/** 
 *   ,      doGetAuthenticationInfo          。
 */  
@Override  
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
    //   principals         
    //  getPrimaryPrincipal             (    doGetAuthenticationInfo       SimpleAuthenticationInfo     ),  
    TAdminUser activeUser = (TAdminUser) principals.getPrimaryPrincipal();  
    //               
    //              
    TAdminRole adminRoles = adminUserService.getAdminRoles(activeUser);  
    //            
    List<String> permissions = new ArrayList<String>();  
    if (adminRoles != null) {  
        permissions.add(adminRoles.getRoleKey());  
    }  
    //       ,      (       permissions)  
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();  
    //              simpleAuthorizationInfo     
    simpleAuthorizationInfo.addStringPermissions(permissions);  
    return simpleAuthorizationInfo;  
}  

//       
public void clearCached() {  
    PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals();  
    super.clearCache(principals);  
}  
}
5 캐 시 설정
ehcache. xml 코드 는 다음 과 같 습 니 다:
  
      
 

ehache 를 사용 하면 서버 에 권한 을 부여 하 는 것 을 피 할 수 있 습 니 다 (
doGetAuthorizationInfo
라 는 요청 을 했다.
6. 사용자 정의 폼 인 코딩 필터
CustomFormAuthenticationFilter 코드, 인증 전에 호출, 인증 코드 검사 에 사용
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {  
    //  FormAuthenticationFilter       
    @Override  
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {  
        //              
    //  session         
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;  
    HttpSession session = httpServletRequest.getSession();  
    //   session    (      )  
    String validateCode = (String) session.getAttribute("validateCode");  

    //           
    //       session          
    String randomcode = httpServletRequest.getParameter("randomcode");  
    if (randomcode != null && validateCode != null && !randomcode.equals(validateCode)) {  
        //       ,          ,  shiroLoginFailure   request   
        httpServletRequest.setAttribute("shiroLoginFailure", "randomCodeError");  
        //     ,           
        return true;  
    }  
    return super.onAccessDenied(request, response);  
}  
}
이 부호 에 인증 코드 jsp 인터페이스의 코드 validatecode.jsp
  
  
  
  
  
  
  
  
  

7. 로그 인 컨트롤 러 방법
/** 
 *       
 *  
 * @return 
 * @throws Exception 
 */  
@RequestMapping("login.do")  
public String adminPage(HttpServletRequest request) throws Exception {  
    //        request         ,shiroLoginFailure  shiro          
    String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");  
    //   shiro          ,          
    if (exceptionClassName != null) {  
        if (UnknownAccountException.class.getName().equals(exceptionClassName)) {  
            //             
            throw new CustomJsonException("     ");  
        } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {  
            throw new CustomJsonException("   /    ");  
        } else if ("randomCodeError".equals(exceptionClassName)) {  
            throw new CustomJsonException("      ");  
        } else {  
            throw new Exception();//                 
        }  
    }  
    //           (    ),shiro                   
    //       login    
    return "admin/login";  
}  

8. 사용자 리 턴 컨트롤 러
사용자 로그 인 인증 이 성공 하면 customeRealm 은 doGetAuthenticationInfo 를 호출 했 을 때 통과 합 니 다.
AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(adminUser, password, this.getName());  
    return authcInfo; 
Simple AuthenticationInfo 구조 적 매개 변수 의 첫 번 째 매개 변 수 는 사용자 의 대상 에 전 달 된 후 Subject subject = Security Utils. getSubject () 를 통 해 전 달 됩 니 다.subject. getPrincipal () 에서 이 대상 을 가 져 옵 니 다.그래서 사용자 정 보 를 표시 해 야 할 때 저 는 이렇게 호출 했 습 니 다.
@RequestMapping("index.do")  
public String index(Model model) {  
    // shiro session  activeUser  
    Subject subject = SecurityUtils.getSubject();  
    //       
    TAdminUser adminUser =  (TAdminUser) subject.getPrincipal();  
    //  model      
    model.addAttribute("adminUser", adminUser);  
    return "admin/index";  
}  

9. jsp 페이지 에서 제어 권한
shiro 헤더 파일 먼저 가 져 오기
    
<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>    
  
  

shiro 태그 로 권한 처리
  
                  
                    

10. Controller 에서 제어 권한
@ RequiresPermissions 설명 을 통 해 이 controller 의 요청 방법 을 실행 하 는 데 필요 한 권한 을 지정 합 니 다.
@RequestMapping("/queryInfo.do")  
    @RequiresPermissions("q")//    "q"    
    public ModelAndView queryItems(HttpServletRequest request) throws Exception { }

11. MD5 암호 화 소금 처리 여 기 는 암호 화 수정 을 예 로 들 어 새로운 암호 화 (명문) 를 가 져 온 후 MD5 암호 화 + 소금 추가 + 3 회 암호 화 를 예 로 들 수 있 습 니 다.
@RequestMapping("updatePassword.do")  
    @ResponseBody  
    public String updateAdminUserPassword(String newPassword) {  
        //  shiro session  activeUser  
        Subject subject = SecurityUtils.getSubject();  
        //        
        TAdminUser adminUser = (TAdminUser) subject.getPrincipal();  
        //   salt,      
        SecureRandomNumberGenerator secureRandomNumberGenerator = new SecureRandomNumberGenerator();  
        String salt = secureRandomNumberGenerator.nextBytes().toHex();  
        Md5Hash md5 = new Md5Hash(newPassword, salt, 3);  
        String newMd5Password = md5.toHex();  
        //        
        adminUser.setPassword(newMd5Password);  
        //      
        adminUser.setSalt(salt);  
        adminUserService.updateAdminUserPassword(adminUser);  
        return newPassword;  
    }  

좋은 웹페이지 즐겨찾기