Skip to content1. MVC Controller 映射 sso 方法。
-
-
-
-
-
-
-
-
-
-
- @RequestMapping(value = "sso/{userCode}/{token}")
- public String sso(@PathVariable String userCode, @PathVariable String token,
- @RequestParam(required=true) String url, String relogin, Model model) {
- Principal principal = UserUtils.getPrincipal();
-
- if(principal != null){
-
- if (BooleanUtils.toBoolean(relogin)){
- UserUtils.getSubject().logout();
- }
-
- else{
- return "redirect:" + Encodes.urlDecode2(url);
- }
- }
-
- if (token != null){
- UsernamePasswordToken upt = new UsernamePasswordToken();
- try {
- upt.setUsername(userCode);
- upt.setPassword(token.toCharArray());
- upt.setParams(upt.toString());
- } catch (Exception ex){
- if (!ex.getMessage().startsWith("msg:")){
- ex = new AuthenticationException("msg:授权令牌错误,请联系管理员。");
- }
- model.addAttribute("exception", ex);
- }
- try {
- UserUtils.getSubject().login(upt);
- return "redirect:" + Encodes.urlDecode2(url);
- } catch (AuthenticationException ae) {
- if (!ae.getMessage().startsWith("msg:")){
- ae = new AuthenticationException("msg:授权错误,请检查用户配置,若不能解决,请联系管理员。");
- }
- model.addAttribute("exception", ae);
- }
- }
- return "error/403";
- }
2. 重载org.apache.shiro.realm.AuthorizingRealm类的assertCredentialsMatch方法
-
-
-
- @Override
- protected void assertCredentialsMatch(AuthenticationToken authcToken,
- AuthenticationInfo info) throws AuthenticationException {
- UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
-
- if (token.toString().equals(token.getParams())){
-
- String secretKey = Global.getConfig("shiro.sso.secretKey");
- String password = Digests.md5(secretKey + token.getUsername() + DateUtils.getDate("yyyyMMdd"));
- if (password.equals(String.valueOf(token.getPassword()))){
- return;
- }
- }
- super.assertCredentialsMatch(token, info);
- }
3. 实现Shiro无状态访问,如通过传递sessionid参数即可实现会话访问
这里需要自定义Shiro的SessionManager类,方法是继承org.apache.shiro.web.session.mgt.DefaultWebSessionManager类,重载getSessionId方法,如下:
- public class SessionManager extends DefaultWebSessionManager {
-
- public SessionManager() {
- super();
- }
-
- @Override
- protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
-
-
- String sid = request.getParameter("__sid");
- if (StringUtils.isNotBlank(sid)) {
-
- if (WebUtils.isTrue(request, "__cookie")){
- HttpServletRequest rq = (HttpServletRequest)request;
- HttpServletResponse rs = (HttpServletResponse)response;
- Cookie template = getSessionIdCookie();
- Cookie cookie = new SimpleCookie(template);
- cookie.setValue(sid); cookie.saveTo(rq, rs);
- }
-
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,
- ShiroHttpServletRequest.URL_SESSION_ID_SOURCE);
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sid);
- request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
- return sid;
- }else{
- return super.getSessionId(request, response);
- }
- }
-
- }