spring mvc 통합 shiro 권한 의 간단 한 사용

10107 단어 자바
1.개술
현재 프로젝트 에 사용 되 는 권한 제어 시스템 은 spring security 3 입 니 다.프로젝트 의 프레임 워 크 는 spring 을 사용 하기 때문에 사용 하 는 김 에 사용 합 니 다.최근 에 spring side 4 를 연 구 했 는데 shiro 를 추천 합 니 다.예시 에 따라 한 차례 하 였 다.기 존 spring 웹 프로젝트 에서절 차 는 다음 과 같다.
2.가방 도입,maven 설정
 
    	org.apache.shiro
    	shiro-all
    	1.2.1
    	jar
    	compile
    

3.컨트롤 러 층 실현
주로 url 로그 인과 몇 개의 숨 김 url 입 니 다.
@Controller
public class AdminController {

	@RequestMapping(value = "/admin/index", method = RequestMethod.GET)
	public String index(Model model) {

		return "admin/index";
	}
	
	
	@RequestMapping(value = "/admin/login", method = RequestMethod.GET)
	public String login(Model model) {
		logger.info("login get");
		return "admin/login";
	}
	
	
	@RequestMapping(value = "/admin/login", method = RequestMethod.POST)
	public String doLogin(Model model) {
		logger.info("login post");
		return "admin/login";
	}
	
	@RequiresRoles("user")
	@RequestMapping(value = "/admin/user", method = RequestMethod.GET)
	public String shiroUser(Model model) {
	
		return "admin/index";
	}
	
	@RequiresRoles("admin")
	@RequestMapping(value = "/admin/admin", method = RequestMethod.GET)
	public String shiroAdmin(Model model) {
		
		return "admin/index";
	}
	
	Logger logger = LoggerFactory.getLogger(AdminController.class);

}

4.권한 검증 실현
shiro 를 잇 는 Authorizing Realm.
public class ShiroDbRealm extends AuthorizingRealm {

	protected AccountService accountService;

	@Autowired
	public void setAccountService(AccountService accountService) {
		this.accountService = accountService;
	}

	/**
	 *         ,                    .
	 */

	@SuppressWarnings("unused")
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection p) {

		logger.info("    :" + p.getRealmNames());
		
		ShiroUser shiroUser = (ShiroUser) p.getPrimaryPrincipal();
		User user = accountService.findUserByLoginName(shiroUser.loginName);

		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		for (Role role : user.getRoleList()) {
			//  Role     
			info.addRole(role.getName());
			//  Permission     
			info.addStringPermission(role.getPermissions());
		}
		return info;
		
	}

	/**
	 *       ,     .
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken authcToken) throws AuthenticationException {
		logger.info("authc pass:");
		UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
		logger.info("authc name:" + token.getUsername());
		User user = accountService.findUserByLoginName(token.getUsername());
		if (user != null) {

			if (user.getStatus().equals("disabled")) {
				throw new DisabledAccountException();
			}			

			logger.info("authc name:" + token.getUsername() + " user:"
					+ user.getLoginName() + " pwd:" + user.getPassword()
					+ "getname:" + getName());

			// byte[] salt = Encodes.decodeHex(user.getSalt());
			return new SimpleAuthenticationInfo(new ShiroUser(user.getLoginName(), user.getName()),					
					user.getPassword(), getName());
		}
		return null;

	}

	/**
	 *    Authentication  ,  Subject                    .
	 */
	public static class ShiroUser implements Serializable {
		private static final long serialVersionUID = -1373760761780840081L;
		public String loginName;
		public String name;

		public ShiroUser(String loginName, String name) {
			this.loginName = loginName;
			this.name = name;
		}

		public String getName() {
			return loginName;
		}

		/**
		 *              .
		 */
		@Override
		public String toString() {
			return loginName;
		}

		/**
		 *   hashCode,   loginName;
		 */
		@Override
		public int hashCode() {
			return Objects.hashCode(loginName);
		}

		/**
		 *   equals,   loginName;
		 */
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			ShiroUser other = (ShiroUser) obj;
			if (loginName == null) {
				if (other.loginName != null)
					return false;
			} else if (!loginName.equals(other.loginName))
				return false;
			return true;
		}
	}

	Logger logger = LoggerFactory.getLogger(ShiroDbRealm.class);

}

사용자 정의 클래스 ShiroUser 는 뒤에 검증 할 때 사용 할 수 있 도록 내용 을 더 전송 할 수 있 도록 하기 위해 서 입 니 다.예 를 들 어 하나의 loginName 만 사 용 했 습 니 다.일반적으로 String 으로 전송 하면 됩 니 다.
로그 인 할 때 doGetAuthenticationInfo()함수 로 관련 정 보 를 얻 습 니 다.
로그 인 후 url 에 방문 하여 doGetAuthorizationInfo()를 사용 하여 사용자 의 권한 을 얻 습 니 다.
5.파일 shiro 부분 설정
controller 의 url 을 권한 검증 범위 에 포함 시 킵 니 다.



	Shiro    

	

	
	
		
	
	
	
	
		
		
		
		
		
			
				/admin/login = authc				
				/admin/logout = logout
				/static/** = anon
				/admin/** = authc
				
			
		
	

	
	
		
	
	
	
	
		
		
	
	
	
	
	
	
	
	
		
	
	
    	
	

주요 내용 은 shiro Filter 의 정의 입 니 다.
loginUrl:페이지 로그 인,사용자 로그 인 실패,자동 으로 이 페이지 로 돌아 갑 니 다.
successUrl:로그 인 성공 후 이 페이지 로 이동
unauthorizedUrl:사용자 가 권한 이 없 는 링크 에 접근 할 때 이 페이지 로 이동
filter Chain Definitions:url 의 접근 권한 을 설정 합 니 다.anon 은 검증 하지 않 아 도 접근 할 수 있 음 을 표시 합 니 다.anthc:authc filter 감청,로그 인하 지 않 으 면 접근 할 수 없습니다.logout:logout filter 감청.목록 에 없 는 일반적인 설정:perms["remote:invoke"]:캐릭터 romote 와 권한 invoke 가 있어 야 접근 할 수 있 습 니 다.roles["admin"]캐릭터 admin 이 있어 야 접근 할 수 있 습 니 다.사용 가능 한","칸 막 이 를 설정 합 니 다.예 를 들 어:
/admin/test = authc,roles[admin]
filter 에 대한 목록:
Filter Name
Class
anon
org.apache.shiro.web.filter.authc.AnonymousFilter
authc
org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic
org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
perms
org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port
org.apache.shiro.web.filter.authz.PortFilter
rest
org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles
org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl
org.apache.shiro.web.filter.authz.SslFilter
user
org.apache.shiro.web.filter.authc.UserFilter
6.설정 파일,shiroFilter 사용
위의 설정 과 소스 코드 는 shiroFilter 를 정의 합 니 다.웹.xml 에서 사용 합 니 다.

	
	
		shiroFilter
		org.springframework.web.filter.DelegatingFilterProxy
	
	
		shiroFilter
		/*
		REQUEST
		FORWARD
	

7.annotation 제어 권한 사용
2 에서 controller 는@RequiresRoles 주해 제어 권한 을 사용 하고@RequirePermissions 일 수도 있 습 니 다.방법 에 주 해 를 사용 하려 면 다음 과 같은 설정 을 해 야 합 니 다.
1.spring-mvc.xml 에 추가
	
	
		
	
	
	
    	
	

2.오류 제어,spring-mvc.xml 에 추가

	  
		  
			
				error/403
				error/500
              
		  
     
Unauthorized Exception 이상 을 403 페이지 로 이동 하거나 다른 페이지 를 사용 할 수 있 습 니 다.
8.참고
1.글 의 내용 은 대부분 개원 공사,spring-side 에서 기원 되 었 으 며,작가 강남 백의 에 게 진심으로 감 사 드 립 니 다.
2.apache-shiro 홈 페이지:http://shiro.apache.org/

좋은 웹페이지 즐겨찾기