springmvc + shiro + maven 로그 인 및 권한 부여
15121 단어 자바 기술 총화
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 설정
4: 사용자 정의 Realm 인 코딩
<!-- 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>
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 를 호출 했 을 때 통과 합 니 다.Simple AuthenticationInfo 구조 적 매개 변수 의 첫 번 째 매개 변 수 는 사용자 의 대상 에 전 달 된 후 Subject subject = Security Utils. getSubject () 를 통 해 전 달 됩 니 다.subject. getPrincipal () 에서 이 대상 을 가 져 옵 니 다.그래서 사용자 정 보 를 표시 해 야 할 때 저 는 이렇게 호출 했 습 니 다.AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(adminUser, password, this.getName()); return authcInfo;
@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; }