spring mvc 통합 shiro 권한 의 간단 한 사용
10107 단어 자바
현재 프로젝트 에 사용 되 는 권한 제어 시스템 은 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/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.